12

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

/
/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 ...
}

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

问题

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

4

2 回答 2

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控制器上的属性不会生效。

于 2013-12-11T17:46:21.453 回答
0

现在对于 SEO,您应该使用规范 url,这意味着单个 url 像这样

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

   public ActionResult ...
}

所以家庭控制器只能在根目录下访问

于 2016-01-26T03:39:05.997 回答