我有这样的行动:
[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 ??
答案 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 });
而且,您最终会得到您想要的网址。