区分 MVC 路由

Differentiating Between MVC Routes

我有两个相似的 seo 友好路线去不同 controllers/actions:

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+" }
);

新闻路线 returns 404 错误,反之亦然,如果我交换它们。我尝试为每个控制器添加一个默认控制器 - 这什么也没做。然后我尝试用控制器的实际名称替换 {controller}。这产生了

The matched route does not include a 'controller' route value, which is required

错误信息。

这是每个 link:

@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>

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

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

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

但是我不能通过这个动作,我会回到一个不太友好的 SEO URL。

最后我想结束:

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

问题是两个操作的 URL 将匹配您添加的第一条路线。例如,这个 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+" }
);