如何设置路由属性的slug?

时间:2014-12-17 18:34:13

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

我有这样的行动:

[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 '并且这不是我想要的,而是书籍/ 1 / awesome-book '。如何正确设置slu ??

1 个答案:

答案 0 :(得分: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")]

然后,您可以使用以下内容生成网址:

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

而且,您最终会得到您想要的网址。