2

在我的 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 操作中(在主区域,而不是管理员),那么 URL 会像这样生成:

/Admin

为什么 RouteLink 不像我认为应该在 MVC 中使用区域那样工作?

4

3 回答 3

3

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

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

当您不指定诸如路由值之类的东西时,大多数 MVC 使用当前存在的值。在这种情况下,由于actionandcontroller值为 null,它会查看RouteValues并检查它们是否存在,如果找到它们,则使用在那里找到的值。

这有时很有帮助。例如,如果您想{id}填充页面上使用的相同值。

网址:/home/edit/1701

@Html.RouteLink("Refresh", "Default")会产生完全相同的 url - 如果需要,您可以指定覆盖。

于 2012-06-29T15:00:58.487 回答
3

我还建议不要命名您的路线。您可以通过在创建路由名称时将 null 传递给路由名称 arg 来强制自己执行此操作。

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 更直观且更容易“正确”。

于 2012-06-29T15:16:54.923 回答
1

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

于 2012-06-29T15:11:52.213 回答