asp.net-mvc - 如何为路由属性设置 slug?

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

我有这样的 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/

相关文章:

asp.net-mvc - 如何使用 ASP.NET MVC 调试查看 Controller 生成的 html?

routes - 嵌套路由从链接触发,而不是从 URL 更改触发

jquery - Meteor Galaxy 部署 - 托管时出现控制台错误且不显示路由

ASP.Net MVC - GET/POST 具有不同模型时的 ModelState.AddModelError

c# - MVC 5 一对多虚拟 ICollection 返回空值?

JQuery Datatables服务器端处理表不刷新内容

laravel 5.2 - 将路由参数传递给 Controller

asp.net-mvc - UserInRole 似乎在 MVC 5 项目中不起作用

c# - 托管 ASP.NET MVC 应用程序 : Security Exception

asp.net-mvc - Ninject.Web.Common 抛出 ActivationException 试图将依赖项注入(inject) HttpApplicationInitializationHttpModule