在默认应用程序ASP.NET MVC 3.0应用程序中,我有一个带有Index()和Details(string id)方法的控制器。这些映射到/ orders /和orders / details / ORDER_ID_HERE。如何更改路由以使详细信息映射到orders / ORDER_ID_HERE,并继续让Index()提供默认索引页?
答案 0 :(得分:2)
如果您要为路线集添加新路线,例如:
routes.MapRoute(
"Detailed", // Route name
"{contoller}/{id}", // URL with parameters
new { controller = "Orders", action = "Details", id = UrlParameter.Optional } // Parameter defaults
);
它可以工作,但你打破了很多东西,例如像 [site] / Home / Search 这样的网址会导致:
System.ArgumentException:参数字典包含参数' id'的空条目。非可空类型的System.Int32' for method' System.Web.Mvc.ActionResult Details(Int32)'在' MvcApplication3.Controllers.OrdersController'。
原因是 / Home / Search 与路线{controller}/{id}
匹配。
解决问题的另一种类似方法是:
routes.MapRoute(
"Detailed", // Route name
"order/{id}", // URL with parameters
new { controller = "Orders", action = "Details", id = UrlParameter.Optional } // Parameter defaults
);
确保路线中的静态部分订单与实际订单控制器的名称不匹配,否则您会遇到同样的问题,呈现 [url使用 System.ArgumentException 无法访问/ orders 而不是调用Index()方法(默认路由)
这种方法的消极方面是,您需要为希望拥有此类功能的每个控制器执行此操作。
答案 1 :(得分:0)
尝试在默认路线之前添加此路线:
routes.MapRoute("SomeName", "{controller}/{id}", new { controller = "Orders", action = "Details" });
注意{action}是如何从URL参数中删除的。