区分MVC路由

时间:2015-06-22 11:52:23

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

我有两条类似的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。

最后我想结束:

  • 地点/ locationId / my-place-name
  • 新闻/ NewSID的/我的新闻项

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

1 个答案:

答案 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']