如何在ASP.NET MVC中创建通配符控制器?

时间:2011-09-10 18:10:45

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

在默认应用程序ASP.NET MVC 3.0应用程序中,我有一个带有Index()和Details(string id)方法的控制器。这些映射到/ orders /和orders / details / ORDER_ID_HERE。如何更改路由以使详细信息映射到orders / ORDER_ID_HERE,并继续让Index()提供默认索引页?

2 个答案:

答案 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参数中删除的。