【问题标题】:Differentiating Between MVC Routes区分 MVC 路由
【发布时间】:2015-06-22 11:52:23
【问题描述】:

我有两条相似的 seo 友好路线去不同的控制器/动作:

routes.MapRoute(
    "Locations",
    "{controller}/{locationId}/{location}",
    new { controller = "Locations", action = "Location", location = UrlParameter.Optional },
    new { locationId = @"\d+" }
);

routes.MapRoute(
    "News",
    "{controller}/{newsId}/{newsTitle}",
    new { controller = "News", action = "NewsItem", newsTitle = UrlParameter.Optional },
    new { newsId = @"\d+" }
);

如果我交换它们,News 路由会返回 404 错误,反之亦然。我尝试为每个控制器添加一个默认控制器 - 这没有做任何事情。然后我尝试用控制器的实际名称替换 {controller} 。这产生了一个

匹配的路由不包含“控制器”路由值,它 是必需的

错误信息。

以下是每个链接:

@Html.ActionLink(x.newsTitle, "NewsItem", "News", new { newsId = x.newsID, newsTitle = x.newsTitle.ToSeoUrl() },null)

<a href="@Url.Action("Location", "Locations", new { locationId = "1", location = "my-place-name" }, null)"><i class="fa fa-map-marker fa-li red"></i>My Place Name</a>

我通过切换 locationId 和 location 查询字符串元素“修复了它”。好的,它可以工作,但我觉得这不是正确的解决方案。如果我有第三个控制器操作与类似的查询字符串对怎么办?

最后的尝试是让路线更通用:

routes.MapRoute(
    "SEO",
    "{controller}/{Id}/{Title}",
    new { Title = UrlParameter.Optional },
    new { Id = @"\d+" }
);

然后我不能通过该操作,我会回到一个对 SEO 不太友好的 URL。

最后我想得到:

  • Lo​​cations/locationId/my-place-name
  • 新闻/newsId/my-news-item

我对 MVC 比较陌生,我确信我缺少一些基本的东西(或者只是愚蠢)。

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    问题在于这两个操作的 URL 将匹配您添加的第一个路由。例如,这个网址:

    http://yoursite.com/News/123/some-news-article
    

    将尝试在您的 News 控制器中调用操作 Locations,这显然不存在并给您一个 404 错误。

    您可以通过在路由的 URL 中指定路径而不是使用 {controller} 来解决此问题。例如:

    routes.MapRoute(
        "Locations",
        "Locations/{locationId}/{location}",
        new { controller = "Locations", action = "Location", location = UrlParameter.Optional },
        new { locationId = @"\d+" }
    );
    
    routes.MapRoute(
        "News",
        "News/{newsId}/{newsTitle}",
        new { controller = "News", action = "NewsItem", newsTitle = UrlParameter.Optional },
        new { newsId = @"\d+" }
    );
    

    【讨论】:

    • 工厂一切正常!我曾尝试在路由中显式添加控制器名称,但没有在默认值中添加它。如此接近,却又如此遥远。谢谢...
    猜你喜欢
    • 2016-12-06
    • 2013-03-12
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2010-12-09
    相关资源
    最近更新 更多