Asp.net mvc ASP.NET MVC将不同的URL映射到具有区域的{controller}/{action}

Asp.net mvc ASP.NET MVC将不同的URL映射到具有区域的{controller}/{action},asp.net-mvc,routing,Asp.net Mvc,Routing,我希望能够使用不符合{controller}/{action}/{id}格式的URL映射路由。映射如下所示: routes.CreateArea("Root", "MyApp.Web.Controllers", routes.MapRoute("Category-List", "Category/{category}", new { controller = "Category", action = "List" }), routes.MapRoute("Def

我希望能够使用不符合{controller}/{action}/{id}格式的URL映射路由。映射如下所示:

routes.CreateArea("Root", "MyApp.Web.Controllers",
    routes.MapRoute("Category-List", "Category/{category}", 
        new { controller = "Category", action = "List" }),
    routes.MapRoute("Default", "{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = "" })
);
其中我有一个
CategoryController
,带有一个动作
列表(字符串类别)

在我看来,我希望能够利用这一点:

<%= Html.ActionLink<CategoryController>(
    c => c.List(category.UrlFriendlyName), 
    category.Name)%>

从外观上看,您所写的内容对于生成所需的URL是正确的。您是否尝试过使用非强类型的
Html.ActionLink
方法来查看其是否有效?

从外观上看,您所写的内容对于生成所需的URL是正确的。您是否尝试过使用非强类型的
Html.ActionLink
方法来查看该方法是否有效?

在您对ActionLink的调用中,我没有看到任何会导致路由系统了解要使用哪条路由的内容。相反,我建议使用Html。RouteLink,允许您按名称指定路由。这将确保匹配正确的路线

更新:您正在进行跨区域链接吗?(换句话说,您链接到的区域是否与包含链接的区域不同?)。如果没有,RouteLink是否有效


我不认为这是导致问题的原因,但我注意到您的类别列表路由没有任何约束,我认为它可能应该约束到类别控制器。

我在您对ActionLink的调用中没有看到任何会导致路由系统意识到要使用哪个路由的内容。相反,我建议使用Html。RouteLink,允许您按名称指定路由。这将确保匹配正确的路线

更新:您正在进行跨区域链接吗?(换句话说,您链接到的区域是否与包含链接的区域不同?)。如果没有,RouteLink是否有效


我不认为这是导致问题的原因,但我注意到您的类别列表路由没有约束,我认为它可能应该约束到类别控制器。

不理想,但您可以使用路由名称方法吗

<%= Html.RouteLink("your link", "Category-List", new {category = "foo"})%>

不理想,但您可以使用路线名称方法吗

<%= Html.RouteLink("your link", "Category-List", new {category = "foo"})%>


不太确定它应该是什么样子,但这不起作用:看起来不错,不过有一段时间没用了!您是否也尝试过为类别设置默认值?不太确定它应该是什么样子,但这不起作用:看起来差不多,但有一段时间没有使用它们了!您是否也尝试过为类别设置默认值?这将符合他的规则,因为它是使用类别控制器和列表操作的链接。不,这完全是错误的,因为它不起作用。为什么?默认值不会导致路由匹配;url模式确实如此。默认值在未提供令牌时使用,而不是在提供令牌时使用。默认值确实会导致路由匹配。默认值由您提供的值覆盖。如果您使用仍然匹配的类别覆盖类别。Garry是正确的,问题是路由在一个区域内,如果没有,ActionLink工作正常。默认设置不会导致路由匹配,而是防止缺少值导致匹配失败。默认情况下,他拥有的路由将匹配任何内容。ActionLink中没有说“匹配此路线,不匹配其他路线。”OTOH的RouteLink这样做。这将符合他的规则,因为这是一个使用类别控制器和列表操作的链接。不,这是完全错误的,因为它不起作用。为什么?默认值不会导致路由匹配;url模式确实如此。默认值在未提供令牌时使用,而不是在提供令牌时使用。默认值确实会导致路由匹配。默认值由您提供的值覆盖。如果您使用仍然匹配的类别覆盖类别。Garry是正确的,问题是路由在一个区域内,如果没有,ActionLink工作正常。默认设置不会导致路由匹配,而是防止缺少值导致匹配失败。默认情况下,他拥有的路由将匹配任何内容。ActionLink中没有说“匹配这条路线,没有其他路线。”OTOH的RouteLink就是这样做的。