我有一个这样的动作:
[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 ”。如何正确设置弹头?
这是生成路由URL的问题。由于slug
route参数是可选的,因此路由框架会在/books/1
URL处停下来,然后附加未包含在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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句