【问题标题】:ASP.NET MVC mapping URLs different to {controller}/{action} with areasASP.NET MVC 映射 URL 与 {controller}/{action} 不同的区域
【发布时间】:2009-03-12 12:16:26
【问题描述】:

我希望能够使用不符合 {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 和一个动作 List(string category)

我希望能够在我的观点中使用它:

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

(为便于阅读添加了换行符)

所有这些都会产生一个与href="" 的链接。从“根”区域删除路由会产生正确的结果。是否可以将这种类型的映射与通用 ActionLink 帮助器一起使用,还是我必须求助于 RouteLink 或类似的硬编码值?

我也尝试了以下方法,但没有成功:

<%= Html.ActionLink(category.Name, "List", "Category", 
new { category = category.UrlFriendlyName }) %>

【问题讨论】:

    标签: asp.net-mvc routing


    【解决方案1】:

    不理想,但可以使用路由名称的方式吗?

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不太确定它应该是什么样子,但这不起作用:
      • 看起来不错,不过好久没用了!您是否也尝试过为类别设置默认值?
      【解决方案3】:

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

      更新:你在做跨区域链接吗? (换句话说,您链接到的区域是否与包含该链接的区域不同?)如果是这样,您必须在调用 ActionLink/RouteLink 时指定该区域。如果没有,RouteLink 是否有效?

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

      【讨论】:

      • 它会符合他的规则,因为它是一个使用 Category 控制器和 List 操作的链接。
      • 不,这是完全错误的,因为它不起作用的事实证明了这一点。为什么?默认值不会导致路由匹配; url 模式可以。未提供令牌时使用默认值,而不是提供时使用。
      • 默认值确实会导致路由匹配。但是,默认值会被您提供的值覆盖。如果您用 Category 覆盖 Category,它仍然匹配。
      • Garry 是正确的,问题是路线在一个区域内,没有 ActionLink 可以正常工作。
      • 默认值不会导致路由匹配,而是防止缺少值导致匹配失败。默认情况下,他拥有的路由将匹配任何内容。 ActionLink 中没有任何内容显示“匹配此路由,不匹配其他路由”。 OTOH RouteLink 就是这样做的。
      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2015-02-17
      • 2010-12-01
      相关资源
      最近更新 更多