如何更改路线值然后重定向到该路线?

时间:2010-09-21 18:43:08

标签: asp.net-mvc-2

我有一个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);
    }
}

1 个答案:

答案 0 :(得分:5)

您可以使用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();
}

这可以为您提供所需的结果。有任何问题请发帖:)