MVC4:用于不同操作的相同URL基础

时间:2013-01-15 14:47:00

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

我想有两条类似的路线:

routes.MapRoute("Detail", "guide/{urlname}", new { controller = "Application", action = "Detail" });
routes.MapRoute("Search", "guide/{keyword1}/{keyword2}", new { controller = "Guide", action = "Index", keyword1 = UrlParameter.Optional, keyword2 = UrlParameter.Optional });

因此,一个路由是一个详细信息页面,它根据其URL名称查找数据库中的对象,另一个路径是基于应用程序生成的关键字的搜索结果页面,两者共享相同的URL根({ {1}})。这两个动作在不同的控制器中。可能的网址是:

/guide

显然,像这样,第二条路线永远不会匹配像/guide/evernote --> should route to the application detail page /guide --> should route to search results without filter /guide/iphone --> should route to iphone apps search results /guide/iphone/medical --> should route to medical iphone apps search results 这样的网址,因为第一条路线已经匹配了相同的网址。

如果控制器无法在数据库中找到对象,我不想在第一个操作中进行重定向。那么有什么其他选择呢?我是否需要为此创建自定义/guide/iphoneRouteHandler,还是有更简单的方式?

2 个答案:

答案 0 :(得分:1)

如果{urlname}是一个类似于它的url,你可以添加一个约束来测试url是否匹配正则表达式:

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

答案 1 :(得分:0)

更改订单,它将起作用:

routes.MapRoute("Search", "guide/{keyword1}/{keyword2}", new { controller = "Guide", action = "Index" });
routes.MapRoute("Detail", "guide/{urlname}", new { controller = "Application", action = "Detail" });