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)
然后我仍然遇到同样的问题.
谁能告诉我如何构建我的路线以获得我想要的结果?综上所述:
如果 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)
| 归档时间: |
|
| 查看次数: |
3379 次 |
| 最近记录: |