是否可以在MVC中稍后生成的所有URL上保留自定义URL前缀?

时间:2013-11-15 16:29:53

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我想在所有MVC生成的网址上保留一些自定义Url上下文。我的情况是:多个角色的用户通过URL访问我的网站,其前缀是他们的角色(即... / admin / {controller} / ...)。这是我的项目的要求,它必须是这样的。我想在稍后在视图,控制器等中生成的每个URL中保留用户角色上下文(Html.ActionLink,Url.Action,RedirectTo等方法)

我在RouteConfig.cs中的路由定义:

// guest route
routes.MapRoute(
    name: "Guest",
    url: "guest/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, userContext = UserRoles.Guest }
);

// authentized user
routes.MapRoute(
    name: "User",
    url: "user/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, userContext = UserRoles.User }
);

// authentized admin 
routes.MapRoute(
    name: "Admin",
    url: "admin/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, userContext = UserRoles.Admin }
);

然后在BaseController中(每个其他控制器从中继承):

protected UserRoles CurrentRole = UserRoles.Admin;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    CurrentRole = (UserRoles)RouteData.Values["userContext"];

    base.OnActionExecuting(filterContext);
}

所以我在每个控制器/动作和视图中都有CurrentRole属性(给定CurrentRole到ViewBag)。我可以通过使用方法将routeValues new {userContext = CurrentRole}添加到url来创建上下文URL。

BUT !!!我已经在没有用户上下文的情况下创建了这个网站,并且不想重写每次使用这样的方法或者创建自己的自定义(Html,Url)扩展来覆盖url使用方法的每个用法。我想创建一些覆盖Url.GenerateUrl()或其他什么东西,以保持我的用户上下文。

你有什么想法吗?

非常感谢

1 个答案:

答案 0 :(得分:3)

更改您的路线,以便Html.ActionLink,Url.Action,RedirectTo将使用当前用户上下文。

routes.MapRoute(
    name: "WithUserContext",
    url: "{usercontext}/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    constraints: new { usercontext = "guest|user|admin" }
);