Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 2 如何更改路由值,然后重定向到该路由?_Asp.net Mvc 2 - Fatal编程技术网

Asp.net mvc 2 如何更改路由值,然后重定向到该路由?

Asp.net mvc 2 如何更改路由值,然后重定向到该路由?,asp.net-mvc-2,Asp.net Mvc 2,我有一个UserAccountController,它采用这样的路由“/{username}/{action}” 我想创建一些功能,这样我就可以将用户带到特定于帐户的页面,而不必预先知道他们的用户名。我希望能够使用URL“/your/{action}”,它将捕获“your”作为他们的用户名发送的事实,获取他们的真实用户名(因为他们已登录),并将他们重定向到“/他们的实际用户名/{action}” 我可以在每个控制器操作中这样做,但我更希望它发生在更早的某个地方,可以在所有控制器操作中这样做。我尝

我有一个UserAccountController,它采用这样的路由
“/{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上,非常有效。