【问题标题】:How to set a slug for a route attribute?如何为路由属性设置 slug?
【发布时间】:2015-02-16 09:42:50
【问题描述】:

我有这样的动作:

[HttpGet]
[Route("~/books/{id:int:min(1)}/{slug?}")]
public ActionResult Book(int? id, string slug)
{
    if (slug == null)
    {
        slug = "awesome-book";
        return RedirectToAction("Book", new { id, slug });
    }

    etc.
}

问题是新路由是像“books/1?slug=awesome-book”这样生成的,这不是我想要的,而是“books/1/awesome-book'。如何正确设置 slug?

【问题讨论】:

  • 你使用的是什么版本的 MVC?

标签: asp.net-mvc routes asp.net-mvc-5 custom-attributes slug


【解决方案1】:

这是生成路由 URL 的问题。由于slug 路由参数是可选的,路由框架在/books/1 处停止,然后将URL 未涵盖的任何参数作为查询字符串添加,在这种情况下包括slug。这是由于路由框架采用的短路系统,您对此无能为力。

不过,有一个解决方法。如果您不使用可选参数,而是使用另一个路由,则可以命名该路由,然后显式引用它。例如:

[Route("~/books/{id:int:min(1)}", Order = 1)]
[Route("~/books/{id:int:min(1)}/{slug}", Order = 2, Name = "BookWithSlug")]

然后,您可以使用以下命令生成 URL:

return RedirectToRoute("BookWithSlug", new { id, slug });

而且,你最终会得到你想要的 URL。

【讨论】:

  • 是的,谢谢,不幸的是,如果您有另一条路线(例如“/books/1/pages”),它会检测到多条路线,因为它无法区分蛞蝓和最后一段路线。
  • 从技术上讲,这在以前就是个问题,就好像你试图去/books/1/pages 你也会有两条匹配的路由。不过,您可以简单地将路由参数更改为 {slug:regex(^(?!pages)$)}
  • 同意并感谢您提供正则表达式解决方案,但感觉不太好,因为如果我有一本名为“pages”的书,我会遇到麻烦。我想我只会在我知道不会有“子路由”的路由上附加一个 slug,除非你有更好的主意(并且也有 id)?我正在考虑将“子路由”更改为 /books/pages?bookId=1 虽然它不是那么漂亮。
  • 好吧,另一种选择是放弃同时拥有 id 和 slug 并只使用其中一个。然后消除歧义,因为您将拥有/books/1/pages/books/some-awesome-book/pages。就个人而言,我会说只需删除 id 并使用 slug 来查询您的对象。
猜你喜欢
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2013-02-28
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多