自定义ASP.NET核心路由,其id和标题用连字符

时间:2017-04-15 10:23:08

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

在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}"
            );

在新闻控制器中,存在以下操作

        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?}"
            );

修改 我尝试用像SO这样的斜杠替换连字符,因此路由模板是{controller=News}/{action=ViewNews}/{id:int}/{title}。这很完美..不明白为什么。我已经试图逃避连字符,因为它可能会从正则表达式中作为特殊字符冲突,这也不起作用。

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

1 个答案:

答案 0 :(得分:0)

我猜你的意思是slug而不是标题?标题意味着您要将其用作参数。仅仅为了拥有更易于描述的URL而使用slug,但实际上并没有在实际路由中使用。

这个案例在" Routing in ASP.NET Core"中已经有很好的文档记录。制品

  

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

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}"
        );