需要在 RouteConfig.cs 中通过 ASP.NET MVC 路由模式简化 URL
Need to simplify URLs via ASP.NET MVC routing pattern in RouteConfig.cs
我正在尝试简化应用程序中的 URLs,并且正在努力处理路由注册。这是一个管理工具。在许多情况下,我们有一个列表视图 (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" 视图就可以正常工作。但是当我 select 一个人时, URL 最终变成了 "mysite/person/index/[id]" 而不是 "mysite/person/[id]"。如果我手动从 URL 中删除 "index" 并创建路径 "mysite/person/[id]",则会出现一条 "resource cannot be found" 消息。
在显示的第二个路由中,我认为给路由一个默认操作会路由到索引页面并将 URL 中的 ID 视为一个 ID,而不是一个操作。使用上面显示的当前配置,如果我导航到 Person/List 视图,我将被路由到 Person/Index 视图。
还有一些与该控制器关联的其他操作(如 JsonResults),我也需要处理这些操作。
编写路由以支持我上面指出的 URL 的正确方法是什么?另外,您能否推荐一个显示多个路由到 URL 比较示例的资源?感谢您的帮助!
=== 2015 年 4 月 9 日 10:21 上午编辑 ===
根据@stephen-reindl 提供的答案,这是我实施的解决方案。由于我们有多个带有 "Detail" 视图的界面,我选择了默认操作 "Detail"。此路由识别 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 }
);
您可以添加一个约束条件,即仅在满足约束条件时才考虑特定路线:
routes.MapRoute(
name: "PersonID",
url: "Person/{id}",
constraints: new { id = @"\d+" },
defaults: new { controller = "Person", action = "Index", id = UrlParameter.Optional }
);
在这种情况下,仅当 id
是一个数字时才会采用此路线。
我正在尝试简化应用程序中的 URLs,并且正在努力处理路由注册。这是一个管理工具。在许多情况下,我们有一个列表视图 (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" 视图就可以正常工作。但是当我 select 一个人时, URL 最终变成了 "mysite/person/index/[id]" 而不是 "mysite/person/[id]"。如果我手动从 URL 中删除 "index" 并创建路径 "mysite/person/[id]",则会出现一条 "resource cannot be found" 消息。
在显示的第二个路由中,我认为给路由一个默认操作会路由到索引页面并将 URL 中的 ID 视为一个 ID,而不是一个操作。使用上面显示的当前配置,如果我导航到 Person/List 视图,我将被路由到 Person/Index 视图。
还有一些与该控制器关联的其他操作(如 JsonResults),我也需要处理这些操作。
编写路由以支持我上面指出的 URL 的正确方法是什么?另外,您能否推荐一个显示多个路由到 URL 比较示例的资源?感谢您的帮助!
=== 2015 年 4 月 9 日 10:21 上午编辑 ===
根据@stephen-reindl 提供的答案,这是我实施的解决方案。由于我们有多个带有 "Detail" 视图的界面,我选择了默认操作 "Detail"。此路由识别 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 }
);
您可以添加一个约束条件,即仅在满足约束条件时才考虑特定路线:
routes.MapRoute(
name: "PersonID",
url: "Person/{id}",
constraints: new { id = @"\d+" },
defaults: new { controller = "Person", action = "Index", id = UrlParameter.Optional }
);
在这种情况下,仅当 id
是一个数字时才会采用此路线。