Asp.net mvc 2 如何更改路由值,然后重定向到该路由?
我有一个UserAccountController,它采用这样的路由Asp.net mvc 2 如何更改路由值,然后重定向到该路由?,asp.net-mvc-2,Asp.net Mvc 2,我有一个UserAccountController,它采用这样的路由“/{username}/{action}” 我想创建一些功能,这样我就可以将用户带到特定于帐户的页面,而不必预先知道他们的用户名。我希望能够使用URL“/your/{action}”,它将捕获“your”作为他们的用户名发送的事实,获取他们的真实用户名(因为他们已登录),并将他们重定向到“/他们的实际用户名/{action}” 我可以在每个控制器操作中这样做,但我更希望它发生在更早的某个地方,可以在所有控制器操作中这样做。我尝
“/{username}/{action}”
我想创建一些功能,这样我就可以将用户带到特定于帐户的页面,而不必预先知道他们的用户名。我希望能够使用URL“/your/{action}”
,它将捕获“your”作为他们的用户名发送的事实,获取他们的真实用户名(因为他们已登录),并将他们重定向到“/他们的实际用户名/{action}”
我可以在每个控制器操作中这样做,但我更希望它发生在更早的某个地方,可以在所有控制器操作中这样做。我尝试在控制器的初始化
方法中执行此操作,方法是将RouteData.Values[“username”]
更改为真实用户名,然后尝试响应.重定向路由(RouteData);Response.End()
更新:
感谢BuildStarted为我提供了以下答案:
public class UserAccountController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if ((string) filterContext.RouteData.Values["username"] != "your")
return;
var routeValues = new RouteValueDictionary(filterContext.RouteData.Values);
routeValues["username"] = UserSession.Current.User.Username;
filterContext.Result = new RedirectToRouteResult(routeValues);
}
}
您可以将FilterAttribute与IActionFilter一起使用,以实现所需的功能
public class UserFilterAttribute : FilterAttribute, IActionFilter {
public void OnActionExecuted(ActionExecutedContext filterContext) {
}
public void OnActionExecuting(ActionExecutingContext filterContext) {
var username = filterContext.RouteData.Values["username"];
var realUserName = ""; //load from database
filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { controller = "Users", action = "Index", username = realUserName }));
}
}
然后在控制器中的ActionResult上,您可以将[UserFilter]
应用于该操作
[UserFilter]
public ActionResult UnknownUserHandler() {
return View();
}
这会让你得到你想要的结果。任何问题请发布:)我不想使用属性,因为我希望它应用于该控制器上的所有操作。但你给我指的是OnActionExecuting方法,它也在Controller上,非常有效。