我想在所有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()
或其他什么东西,以保持我的用户上下文。
你有什么想法吗?
非常感谢
答案 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" }
);