【问题标题】:How can I create a friendly URL in ASP.NET MVC?如何在 ASP.NET MVC 中创建友好的 URL?
【发布时间】:2010-09-18 02:13:24
【问题描述】:

如何在 ASP.NET MVC 框架中生成友好的 URL?例如,我们有一个如下所示的 URL:

http://site/catalogue/BrowseByStyleLevel/1

1 是要浏览的学习级别(在本例中为更高)的 Id,但我想以与 StackOverflow 相同的方式重新格式化 URL。

例如,这两个 URL 会将您带到同一个地方:

https://stackoverflow.com/questions/119323/nested-for-loops-in-different-languages

https://stackoverflow.com/questions/119323/

编辑: url 的友好部分被称为 slug

【问题讨论】:

  • 你到底想看什么样的url,这个/catalogue/BrowseByStyleLevel/1/Higher?还是 /catalogue/BrowseByStyleLevel/Higher?
  • 理想情况下是第二个,但我需要 Id 来保存每次根据文本查找。
  • 请参阅stackoverflow.com/a/20662188/1298685 了解ASP.NET MVC 5 解决方案。

标签: c# asp.net-mvc asp.net-mvc-routing friendly-url slug


【解决方案1】:

这就是我在我的应用程序中实现 slug URL 的方式。 注意:默认的 Maproute 不应更改,并且路由按照添加到路由列表的顺序进行处理。

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home",
          action = "Index",
          id = UrlParameter.Optional
    } // Parameter defaults
);
routes.MapRoute("Place", "{controller}/{action}/{id}/{slug}", new { controller = "Place", action = "Details", id = UrlParameter.Optional,slug="" });

【讨论】:

  • 感谢您的注意,路由匹配顺序确实很重要,就像在大多数框架中一样。
【解决方案2】:

有两个步骤可以解决这个问题。首先,创建新路由或更改默认路由以接受附加参数:

routes.MapRoute(  "Default", // Route name
                   "{controller}/{action}/{id}/{ignoreThisBit}", 
                   new { controller = "Home", 
                         action = "Index", 
                         id = "",
                         ignoreThisBit = ""}  // Parameter defaults )

现在您可以在 URI 末尾输入任何您想要的内容,应用程序将忽略它。

渲染链接时,需要添加“友好”的文字:

<%= Html.ActionLink("Link text", "ActionName", "ControllerName",
                    new { id = 1234, ignoreThisBit="friendly-text-here" });

【讨论】:

  • 嗨,如果我尝试这个,从 Html.ActionLink 生成的 url 如下所示: /Catalogue/BrowseBySubject/3?subject=chemistry 而不是 /Catalogue/BrowseBySubject/3/chemistry 任何想法 -我在“默认”路由下方添加了路由,并将名称更改为“BrowseBySubject”。
  • 这意味着它没有找到正确的路线。将路由移到 Default 上方(如果没有其他东西可以区分它们,这将隐藏默认值,例如约束)。使用约束使这条新路线仅在需要时才被发现(例如,在 Catalogue/BrowseBySubject 上,或任何您的规则)。
  • @CraigStuntz ,与其他方法相比,您的方法似乎很容易。但这会对 SEO 友好吗?
【解决方案3】:

你在 global.asax 上有一条路线

  routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = ""} 
                    // Parameter defaults )

您可以定义自己的路线,例如:

controller 是 controllers 文件夹中的 cs 类。

您可以使用您选择的名称来定义您的 ID。

系统会将值传递给您的 actionResult 方法。

您可以在此处阅读有关此步骤的更多信息:http://www.asp.net/learn/mvc/tutorial-05-cs.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 2010-09-21
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多