使用ID或操作名称的ASP.NET MVC路由

Ben*_*ale 5 c# asp.net-mvc asp.net-mvc-routing

我有一个ASP.Net应用程序,它有一个名为'Customers'的区域.该区域有一个名称相同的控制器,只有一个名为Index的方法.

我定义了以下路线:

context.MapRoute(null,
    "Customers/{controller}/{action}",
    new { controller = "customers", action = "Index" }
);
Run Code Online (Sandbox Code Playgroud)

这允许我导航以使用以下URL导航到我的Customers控制器上的索引方法.

MYDOMAIN /客户

在我的客户区域,我还有另一个叫做产品的控制器.这有许多方法可以让我使用产品实体(目前主要由Visual Studio自动生成).

使用我当前的路线,我可以使用以下URL链接到产品控制器:

MyDomain/Customers/Products(显示产品控制器的索引页面)MyDomain/Customers/Products/Create(显示添加新产品的页面).MyDomain/Customers/Products/Details?id = 1234(显示ID为1234的产品)

现在我想要做的是导航到详细信息页面,其中包含更加用户友好的URL,例如:

MYDOMAIN /客户/产品/ 1234

我已经定义了一个如下所示的新路由:

context.MapRoute(null,
    "Customers/Products/{id}",
    new { controller = "Products", action = "Details" }
    );
Run Code Online (Sandbox Code Playgroud)

路线我演示的第一条路线之前定义.这允许我根据需要导航到产品页面,但是我无法再导航到我的产品控制器上的其他方法.

EG以下URL

MYDOMAIN /客户/产品/创建

给我以下错误:

参数字典包含方法'System.Web.Mvc.ViewResult Details(Int32)'的非可空类型'System.Int32'的参数'id'的空条目

如果我更改路由的顺序,那么我可以导航到我的产品控制器上的所有方法,但我的详细信息URL将恢复为具有查询参数的旧格式.

如果我更新路线看起来像这样:

context.MapRoute(null,
    "Customers/Products/{id}",
    new { controller = "Products", action = "Details", id = UrlParameter.Optional }
    );
Run Code Online (Sandbox Code Playgroud)

然后我仍然遇到同样的问题.

谁能告诉我如何构建我的路线以获得我想要的结果?综上所述:

  1. 如果我导航到客户区域,我希望我的网址看起来像'MyDomain/Customers'
  2. 如果我导航到产品详细信息页面,我希望我的URL看起来像"MyDomain/Customers/Products/1234".
  3. 如果我导航到任何其他产品页面,我希望我的网址看起来像'MyDomain/Customers/Products/Create'

Ric*_*ton 4

如果 ID 始终是 int,那么您可以向路由添加约束,如下所示:

context.MapRoute(null,
                 "Customers/Products/{id}",
                 new {controller = "Products", action = "Details", id = UrlParameter.Optional},
                 new {id = @"\d+"} // Constraint to only allow numbers
                );
Run Code Online (Sandbox Code Playgroud)