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

时间:2013-12-11 14:50:56

标签: asp.net-mvc-routing asp.net-mvc-5 attributerouting

传统路由默认值意味着我们能够访问这些网址并始终采用相同的操作:

/
/Home
/Home/Index

但今天我们会写下这些内容:

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

    public ActionResult ...
}

但是这个路由定义绝不相同。

/           (fails)
/Home       (works)
/Home/Index (works)

因此,如果我们将高级代码更改为

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

    public ActionResult ...
}

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

/           (works)
/Home       (fails)
/Home/Index (fails)

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

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

    public ActionResult ...
}

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

问题

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

2 个答案:

答案 0 :(得分:12)

是的,对,你有什么是在这里做的事情......

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

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

   public ActionResult ...
}

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

答案 1 :(得分:0)

现在对于搜索引擎优化你应该使用规范网址,这意味着像这样的单个网址

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

   public ActionResult ...
}

因此只能在root用户访问家庭控制器