我有一个UserAccountController,它接受这样的路由"/{username}/{action}".
我想创建一些功能,以便我可以将用户带到特定于帐户的页面,而无需事先知道他们的用户名.我希望能够使用URL "/your/{action}"来捕获"你的"作为用户名发送的事实,获取真实用户名(因为他们已登录),并将其重定向到"/他们的实际用户名/ {行动}".
我可以在每个控制器操作中执行此操作,但我宁愿让它发生在之前的某个位置,这将为所有控制器操作执行此操作.我尝试在Controller的Initialize方法中通过更改RouteData.Values["username"]为真实的用户名然后尝试Response.RedirectToRoute(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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将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 }));
}
}
Run Code Online (Sandbox Code Playgroud)
然后在控制器中的ActionResult上,您可以应用于[UserFilter]该操作.
[UserFilter]
public ActionResult UnknownUserHandler() {
return View();
}
Run Code Online (Sandbox Code Playgroud)
这应该可以为您提供所需的结果.有任何问题请发帖:)
| 归档时间: |
|
| 查看次数: |
5335 次 |
| 最近记录: |