MVC 5中的属性路由和可选的默认值

Rob*_*nik 12 asp.net-mvc-routing attributerouting asp.net-mvc-5

传统的路由默认值意味着我们能够访问这些URL并始终以相同的操作结束:

/
/Home
/Home/Index
Run Code Online (Sandbox Code Playgroud)

但今天我们将在这些方面写一些东西:

[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    public ActionResult Index() {}

    public ActionResult ...
}
Run Code Online (Sandbox Code Playgroud)

但是这种路由定义绝不相同.

/           (fails)
/Home       (works)
/Home/Index (works)
Run Code Online (Sandbox Code Playgroud)

因此,如果我们将上层代码更改为

[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    [Route("~/")]
    public ActionResult Index() {}

    public ActionResult ...
}
Run Code Online (Sandbox Code Playgroud)

但随后我们将处理工作颠倒过来:

/           (works)
/Home       (fails)
/Home/Index (fails)
Run Code Online (Sandbox Code Playgroud)

我们可以使声明性代码更加冗长,并通过以下方式使其成为旧式路由机制:

[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    [Route("~/")]
    [Route("~/Home")]
    [Route("~/Home/Index")]
    public ActionResult Index() {}

    public ActionResult ...
}
Run Code Online (Sandbox Code Playgroud)

这适用于所有三种不同的路线.

此问题当然绑定到默认控制器和操作的应用程序默认操作.只是我想知道这是否是唯一的方法呢?有没有更简洁的代码方式让它按预期工作?

Kir*_*lla 12

是的,对..你有什么办法在这里做...

我在这里修改了一下代码:

[RoutePrefix("Home")]
[Route("{action}")]
public class HomeController
{
   [Route("~/")]    // GET /
   [Route]          // GET /Home
   [Route("Index")] // GET /Home/Index
   public ActionResult Index() {}

   public ActionResult ...
}
Run Code Online (Sandbox Code Playgroud)

一些细节:
1.您的第一个案例与传统路由不完全相同,因为在这种情况下,您有一个文字段Home,它与传统路由选项不同{controller}/{action}/{id} and controller = Home, action=Index,id=optional.
2.如果Route在操作中使用属性,Controller上的属性不生效,则第二种情况应按设计进行.