如何为路由属性设置一个子弹?

我有一个这样的动作:

[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的问题。由于slugroute参数是可选的,因此路由框架会在/books/1URL处停下来,然后附加未包含在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章