使用RouteLink和区域

时间:2012-06-29 14:50:30

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing asp.net-mvc-areas

在我的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中的区域一样工作?

3 个答案:

答案 0 :(得分:3)

@Html.RouteLink("Admin", "Admin_default")此路由使用名称为Admin_default的路由,因此它始终使用该路由生成网址。

@Html.RouteLink("Admin", "Admin_default", new { controller = "Home", action = "Index" })

如果未指定路由值等内容,则大多数MVC都会使用当前存在的值。在这种情况下,由于actioncontroller值为空,它会查看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)

建议不要命名路由,因为它会在您的视图中创建对现有路由的依赖关系。我建议使用空值