区分 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。
最后我想结束:
- Locations/locationId/my-place-name
- News/newsId/my-news-item
我对 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+" }
);
我有两个相似的 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。
最后我想结束:
- Locations/locationId/my-place-name
- News/newsId/my-news-item
我对 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+" }
);