【问题标题】:Custom ASP.NET Core route with id and title separated by hyphen带有 id 和标题的自定义 ASP.NET Core 路由由连字符分隔
【发布时间】:2017-09-11 12:01:05
【问题描述】:

在 ASP.NET Core 中,我想生成某种 SEO-URL,其中包含条目的 id 以及他的标题。

示例:example.com/News/ViewNews/123-test-news

在 Startup.cs 我定义了以下路线

            routes.MapRoute(
                name: "SeoNews",
                template: "{controller=News}/{action=ViewNews}/{id:int}-{title}"
            );

在News-Controller中,存在以下Action

        public IActionResult ViewNews(int id, string title) { }

里面的断点给了我空值,所以 id = 0 和 title = null。

打电话

示例:example.com/News/ViewNews/123

给我 id = 123,但标题为空,因为它不在 URL 中。我的重写路由有什么问题?

我定义的其他路线我的自定义路线之后:

            routes.MapRoute(
                name: "AreaRoute",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
            );

            routes.MapRoute(
                name: "DefaultMVCRoute",
                template: "{controller=Dashboard}/{action=Index}/{id?}"
            );

编辑 我尝试用斜杠替换连字符,所以路由模板是{controller=News}/{action=ViewNews}/{id:int}/{title}。这完美..不明白为什么。我已经尝试转义连字符,因为它可能与正则表达式中的特殊字符发生冲突,这也不起作用。

使用斜杠作为分隔符对我来说是一个合适的解决方法。但我很想知道这个字符有什么特别之处,它不起作用,所以我重命名了问题标题。

【问题讨论】:

  • 您是否在默认路线上方添加了此内容?
  • 是的,我在自定义路由之后定义了区域和默认 MVC 路由,并在第一篇文章中添加了他们的代码。
  • 如果你尝试example.com/News/ViewNews/123-testnews url 会有什么表现?
  • 首先,上述路线中的标题是强制性参数,而不是可选参数。其次,您可以使用 * 标记 url 的 slug/remaining(即 {*slug} 以及它之后的所有内容)

标签: c# asp.net-core asp.net-core-mvc asp.net-core-1.1


【解决方案1】:

我猜你的意思是slug而不是title?标题将暗示您想将其用作参数。一个 slug 只是为了有一个更可描述的 URL,但实际上并没有在真正的路由中使用。

这个案例在“Routing in ASP.NET Core”文章中的 ASP.NET Core 文档中有很好的记录。

您可以使用 * 字符作为路由参数的前缀以绑定到 URI 的其余部分 - 这称为包罗万象的参数。例如,blog/{*slug} 将匹配任何以 /blog 开头并在其后有任何值的 URI(将分配给 slug 路由值)。包罗万象的参数也可以匹配空字符串。

routes.MapRoute(
        name: "SeoNews",
            template: "{controller=News}/{action=ViewNews}/{id:int}/{*slug}"
        );

{controller=News}/{action=ViewNews}/{id:int}-{title} 不起作用的一个原因是title 不是可选的。其次是它试图匹配斜线之间的整个模式,因此每个段只能有一个参数。

你也可以试试这个,但我怀疑它会起作用

routes.MapRoute(
        name: "SeoNews",
            template: "{controller=News}/{action=ViewNews}/{id:int}{*slug}"
        );

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多