对于我的管理区域,我创建了一条特殊路线。我做了这个,所以我的网址看起来更干净,它避免了我有两个同名控制器的问题。
示例:我有一个UserController和另一个AdminUserController用于应用程序的管理站点。
我不希望网址像:
http://www.example.com/user/...
http://www.example.com/admin/adminuser/...
我希望管理员网址看起来像:
http://www.example.com/admin/user/...
现在为了获得这个url结构,我尝试了这个:
我命名了我的管理员控制器:AdminUserController
然后我的路线看起来像:
routes.Add(new Route("admin/Admin{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""});
});
这可以吗? (该路线目前无效)
我确保这条路线在通用路线上方。
更新
我希望我的所有管理员网址都以/ admin /文件夹作为前缀,所以:
www.example.com/admin/user
www.example.com/admin/settings
www.example.com/admin/articles
和非管理员就像:
www.example.com/user
www.example.com/articles
答案 0 :(得分:3)
不,那不行。
请记住,我们会将“Controller”附加到为{controller}传入的网址部分。因此,在那里工作的URL是:
/管理/ AdminAdminUser /
试试这个。
routes.Add(new Route("admin/user/admin/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "AdminUser", action = "index", Id=""})
});
我假设AdminUser控制器是一种特殊情况,并且您没有以/ user /开头的其他控制器。如果您这样做,另一种方法是将AdminUserController重命名为AdminController。然后:
routes.Add(new Route("admin/user/{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""}),
Constraints = new RouteValueDictionary(new { controller = "Admin|Other|Other2"})
});
这里我使用约束来限制此特定路径适用的控制器。
BTW,我建议使用MapRoute扩展方法。它们使得路径注册更加简洁。
答案 1 :(得分:3)
routes.Add(new Route("admin/Admin{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""});
});
将强制您拥有“admin / AdminUser”...
routes.MapRoute(
"Default", // Route name
"admin/{action}/{id}", // URL with parameters
new { controller = "Admin", action = "User", id = "" } // Parameter defaults
);
将允许您拥有一个带有操作用户的管理控制器
更准确地说,您要做的是创建一个区域(使用MVC 2)
http://odetocode.com/Blogs/scott/archive/2009/10/13/asp-net-mvc2-preview-2-areas-and-routes.aspx
应该给你你想要的东西......
答案 2 :(得分:0)
使用1.0时,唯一的方法是:
使用1.0,唯一的方法是使用
单独映射每个控制器 routes.MapRoute(
"AdminUserRoute", // Route name
"admin/user/{action}/{id}", // URL with parameters
new { controller = "AdminUser", action = "Index", id = "" }
);
routes.MapRoute(
"AdminWorkRoute", // Route name
"admin/work/{action}/{id}", // URL with parameters
new { controller = "AdminWork", action = "Index", id = "" }
);
答案 3 :(得分:0)
创建一个IRouteHandler的实现,它将拦截所请求的控制器并将“admin”附加到前面
public class AdminRouteHandler : IRouteHandler
{
private readonly IRouteHandler _mvcHandler = new MvcRouteHandler();
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var values = requestContext.RouteData.Values;
if(values.ContainsKey("controller"))
values["controller"] = "Admin" + values["controller"];
return _mvcHandler.GetHttpHandler(requestContext);
}
}
在注册路线时使用它,将Home
替换为 admin / 指示您的控制器。默认情况下保留Home
会在通过AdminHome
后映射到AdminRouteHandler
。
routes.Add(new Route("admin/{controller}/{action}/{id}", new AdminRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Home", action = "index", Id=""});
});