在我的MVC应用程序中,我定义了一个默认路由:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new []{ "Demo.Controllers" }
);
我创建了一个名为Admin的新区域,它在AdminAreaRegistration类中添加了一条路径:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", controller = "Home", id = UrlParameter.Optional }
);
}
在我的主_Layout文件中,我尝试执行以下操作:
@Html.RouteLink("Admin", "Admin_default")
它仅适用于某些情况(例如,如果我已经在管理员页面中)。如果我在我的网站的/ Home / About部分,那么URL就会生成如下:
/Admin/Home/About
如果我在Home控制器的Index操作中(在主区域,而不是admin),那么URL就会生成如下:
/Admin
为什么RouteLink不能像我认为应该使用MVC中的区域一样工作?
答案 0 :(得分:3)
@Html.RouteLink("Admin", "Admin_default")
此路由使用名称为Admin_default
的路由,因此它始终使用该路由生成网址。
@Html.RouteLink("Admin", "Admin_default", new { controller = "Home", action = "Index" })
如果未指定路由值等内容,则大多数MVC都会使用当前存在的值。在这种情况下,由于action
和controller
值为空,它会查看RouteValues
并检查它们是否存在,如果找到它们,则会使用在此处找到的值
这有时很有帮助。例如,如果您希望使用页面上使用的相同值填充{id}
。
网址:/home/edit/1701
@Html.RouteLink("Refresh", "Default")
会产生相同的网址 - 如果需要,您可以指定替换。
答案 1 :(得分:3)
我还建议不要命名你的路线。您可以通过在创建路由名称arg时将null传递给强制执行此操作。
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(null,
"Admin/{controller}/{action}/{id}",
new { action = "Index", controller = "Home", id = UrlParameter.Optional }
);
}
然后您可以像这样使用RouteLink:
@Html.RouteLink("Admin",
new { controller = "Home", action = "Index", area = "Admin" })
回复评论
希望我可以说我想出了这个主意。从Steve Sanderson的MVC书中了解到这一点。有大量的方法重载将路由名称作为参数(RouteLink,还有RedirectToRoute等)。不使用路由名称会强制您使用这些方法的其他重载,IMO更直观,更容易“正确”。
答案 2 :(得分:1)
建议不要命名路由,因为它会在您的视图中创建对现有路由的依赖关系。我建议使用空值