【发布时间】:2015-06-14 02:19:35
【问题描述】:
我正在尝试简化应用程序中的 URL,并且正在为路由注册而苦苦挣扎。这是一个管理工具。在许多情况下,我们有一个列表视图 (List.cshtml) 和一个详细信息视图 (Index.cshtml)。我想为这些 URL 实现的模式如下:
http://mysite/person/list (This view shows a list of people)
http://mysite/person/123 (View will show details for a person with an ID of 123)
以这种方式格式化 URls 更像是一个完善网站的好功能。我尝试了几条路线,在 RouteConfig 中,这里有一些我尝试过的较新的路线。
routes.MapRoute(
name: "Person",
url: "Person/{action}/{id}",
defaults: new { controller = "Person", action = "Index" }
);
routes.MapRoute(
name: "PersonID",
url: "Person/{id}",
defaults: new { controller = "Person", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional }
);
现在,如果我删除这些自定义路由,并使用默认路由运行,“mysite/person/list”视图就可以正常工作。但是当我选择一个人时,URL 最终是“mysite/person/index/[id]”而不是“mysite/person/[id]”。如果我从该 URL 中手动删除“索引”并将路径设为“mysite/person/[id]”,则会出现“找不到资源”消息。
在显示的第二个路由中,我认为为路由提供默认操作将路由到索引页面并将 URL 中的 ID 视为 ID,而不是操作。使用上面显示的当前配置,如果我导航到 Person/List 视图,我将被路由到 Person/Index 视图。
还有一些与该控制器相关的其他操作(如 JsonResults),我也需要处理这些操作。
编写路由以支持我上面指出的 URL 的正确方法是什么?另外,您能否推荐一个显示多个路由到 URL 比较示例的资源?感谢您的帮助!
=== 2015 年 4 月 9 日上午 10:21 编辑 ===
根据@stephen-reindl 提供的答案,这是我实施的解决方案。由于我们有多个带有“详细信息”视图的界面,因此我选择了“详细信息”的默认操作。此路由识别 GUID。
// Support URL format of http://mysite/{controller}/{guid}
// Example: http://mysite/person/474f4357-39b2-45a2-b02b-6be04b2302fe
routes.MapRoute(
name: "DetailViewWithGuid",
url: "{controller}/{id}",
constraints: new { id = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b" },
defaults: new { action = "Detail", id = UrlParameter.Optional }
);
【问题讨论】:
标签: asp.net-mvc routes