我有一个名为“顾客(Customers)”的ASP.Net应用程序。该区域有一个同名控制器,其中只有一个名为Index的方法。
我定义了以下路由:
context.MapRoute(null,
"Customers/{controller}/{action}",
new { controller = "customers", action = "Index" }
);
这使我能够使用以下URL导航到我的Customers控制器上的index方法。
MyDomain/Customers
在我的客户区域中,我还有另一个名为products的控制器。这个控制器有许多方法,允许我使用产品实体(目前大多数是由Visual Studio自动生成的)。
使用当前路由,我可以使用以下URL导航到products控制器:
MyDomain/Customers/Products(显示产品控制器的索引页面)MyDomain/Customers/Products/Create(显示添加新产品的页面)。 MyDomain/Customers/Products/Details?id=1234(显示id为1234的产品)
现在我想要做的是使用更加用户友好的URL导航到详细信息页面,例如:
MyDomain/Customers/Products/1234
我定义了一个新路由,看起来像这样:
context.MapRoute(null,
"Customers/Products/{id}",
new { controller = "Products", action = "Details" }
);
在我展示的第一个路由之前定义了路由。这使我能够按照我的意愿导航到产品页面,但我不能再导航到我的产品控制器上的其他方法。
例如,以下URL:
MyDomain/Customers/Products/Create 会给我以下错误信息:
参数字典包含非空类型'System.Int32'的参数'id'的空条目,用于方法'System.Web.Mvc.ViewResultDetails(Int32)'
如果我改变路由的顺序,那么我可以导航到我的产品控制器上的所有方法,但是我的详细信息URL将恢复到具有查询参数的旧格式。
如果我更新路由以看起来像这样:
context.MapRoute(null,
"Customers/Products/{id}",
new { controller = "Products", action = "Details", id = UrlParameter.Optional }
);
我仍然遇到同样的问题。
有人可以告诉我如何构建我的路由以获得想要的结果吗? 简而言之:
- 如果我导航到“客户”区域,我希望我的URL看起来像“MyDomain/Customers”
- 如果我导航到产品详细信息页面,我希望我的URL看起来像“MyDomain/Customers/Products/1234”。
- 如果我导航到任何其他产品页面,我希望我的URL看起来像“MyDomain/Customers/Products/Create”
Customer/Products/1234
而不是Customer/Products/Detail/1234
。 - Tomas Jansson