我有一个 ASP.Net 应用程序,它有一个名为“客户”的区域。这个区域有一个同名的控制器,带有一个名为 Index 的方法。
我定义了以下路线:
context.MapRoute(null,
"Customers/{controller}/{action}",
new { controller = "customers", action = "Index" }
);
这允许我导航以使用以下 URL 导航到我的客户控制器上的 index 方法。
我的域/客户
在我的客户区,我还有另一个控制器,称为产品。这有许多方法可以让我使用产品实体(目前主要由 Visual Studio 自动生成)。
使用我当前的路线,我可以使用如下 URL 导航到产品控制器:
MyDomain/Customers/Products(显示产品控制器的索引页面) MyDomain/Customers/Products/Create(显示添加新产品的页面)。MyDomain/Customers/Products/Details?id=1234(显示 id 为 1234 的产品)
现在我想要做的是导航到具有更加用户友好的 URL 的详细信息页面,例如:
我的域/客户/产品/1234
我定义了一条如下所示的新路线:
context.MapRoute(null,
"Customers/Products/{id}",
new { controller = "Products", action = "Details" }
);
该路线是在我演示的第一条路线之前定义的。这使我可以根据需要导航到产品页面,但是我无法再导航到产品控制器上的其他方法。
EG 以下网址
我的域/客户/产品/创建
给我以下错误:
参数字典包含方法“System.Web.Mvc.ViewResult Details(Int32)”的不可空类型“System.Int32”的参数“id”的空条目
如果我更改路由的顺序,那么我可以导航到产品控制器上的所有方法,但我的详细信息 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”