我有这样的 Action :
[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.
}
问题是新路由的生成类似于' 书/1?slug=awesome-book ' 而这不是我想要的,而是 ' 书/1/awesome-book '。如何正确设置弹头?
最佳答案
这是生成路由 URL 的问题。自 slug
route 参数是可选的,路由框架在 /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。
关于asp.net-mvc - 如何为路由属性设置 slug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27532424/