我有两条类似的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+" }
);
新闻路线返回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>
我修好了它&#39;通过切换locationId和位置查询字符串元素。好的,所以它有效,但我觉得这不是正确的解决方案。如果我有一个具有类似查询字符串对的第三个控制器操作怎么办?
最后的尝试是让路线更通用:
routes.MapRoute(
"SEO",
"{controller}/{Id}/{Title}",
new { Title = UrlParameter.Optional },
new { Id = @"\d+" }
);
然后我就不能通过这个动作了,我又回到了一个不那么SEO友好的URL。
最后我想结束:
我对MVC比较陌生,我确定我错过了一些基本的东西(或者只是愚蠢的)。
答案 0 :(得分:1)
问题是这两个操作的网址都与您添加的第一条路线相匹配。例如,此网址:
Locations
将尝试在您的News
控制器中调用操作{controller}
,这显然不存在,并且会给您404错误。
您可以通过在路径的网址中指定路径而不是使用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+" }
);
来解决此问题。例如:
$this->request->data['search']['keyword']