【问题标题】:Need to simplify URLs via ASP.NET MVC routing pattern in RouteConfig.cs需要通过 RouteConfig.cs 中的 ASP.NET MVC 路由模式简化 URL
【发布时间】: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


    【解决方案1】:

    您可以添加一个约束,即仅在满足约束时才考虑特定路由:

    routes.MapRoute(
        name: "PersonID",
        url: "Person/{id}",
        constraints: new { id = @"\d+" },
        defaults: new { controller = "Person", action = "Index", id = UrlParameter.Optional }
    );
    

    在这种情况下,仅当id 是数字时才采用此路由。

    【讨论】:

    • 谢谢斯蒂芬!在我的情况下,ID 是 GUID 而不是整数,所以我应用了这个正则表达式: constraints: new { id = @"\b[A-F0-9]{8}(?:-[A-F0-9] {4}){3}-[A-F0-9]{12}\b" }。现在像冠军一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2010-11-22
    相关资源
    最近更新 更多