如何为路由属性设置 slug?

Dan*_*Dan 5 asp.net-mvc routes custom-attributes slug asp.net-mvc-5

我有一个这样的动作:

[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.
}
Run Code Online (Sandbox Code Playgroud)

问题是新路由的生成方式类似于“ books/1?slug=awesome-book ”,这不是我想要的,而是“ books/1/awesome-book ”。如何正确设置滑块?

Chr*_*att 4

这是生成路由 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")]
Run Code Online (Sandbox Code Playgroud)

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

return RedirectToRoute("BookWithSlug", new { id, slug });
Run Code Online (Sandbox Code Playgroud)

并且,您最终会得到您想要的 URL。