需要在 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 是一个数字时才会采用此路线。