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


传统的路由默认值意味着我们能够访问这些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 ...
}

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

这个问题当然必然受到影响 应用默认动作 默认控制器和操作。就是这样 我想知道这是否是唯一的方法呢? 有没有更简洁的代码方式让它按预期工作?


11071
2017-12-11 14:50


起源



答案:


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

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

[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
如果a,你的第二个案例是按设计预期的 Route 属性用于操作,Controller上的属性不生效。


12
2017-12-11 17:46



你是对的 调节器 部分。在这种情况下,我使用静态URL段而不是变量。真正。 我只是觉得会有一些不那么冗长的方式 实现同样的目标。显然没有。你有点编写类似于冗长的代码...我希望少一些。 :) - Robert Koritnik
是的,但问题是你通常只在整个应用程序中只有一条路线,你想要一个匹配的请求 GET / 所以只有在那种情况下它才会冗长,对于应用程序的其余部分,你可以使用类似的模式 [RoutePrefix("Home")][Route("{action=Index}")]..你同意吗? - Kiran Challa
我当然同意。要想到这一点,我们并不需要“/”,“/ Home”和“/ Home / Index”指向同一页面。 “/“ 足够。我们有最后一对,因为路由以这种方式工作。只有一个使得册选更简单。因此,我会忽视它们,而不是首先提供它们。 - Robert Koritnik
当然 / 这就足够了,但我只是在展示你已经想做的事情,否则整个问题就不会出现了 - Kiran Challa
我不需要 "{action}" 我班上的路线。然后我就加入了 [Route("~/"), Route("index")] 我的方法。 - eth0


答案:


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

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

[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
如果a,你的第二个案例是按设计预期的 Route 属性用于操作,Controller上的属性不生效。


12
2017-12-11 17:46



你是对的 调节器 部分。在这种情况下,我使用静态URL段而不是变量。真正。 我只是觉得会有一些不那么冗长的方式 实现同样的目标。显然没有。你有点编写类似于冗长的代码...我希望少一些。 :) - Robert Koritnik
是的,但问题是你通常只在整个应用程序中只有一条路线,你想要一个匹配的请求 GET / 所以只有在那种情况下它才会冗长,对于应用程序的其余部分,你可以使用类似的模式 [RoutePrefix("Home")][Route("{action=Index}")]..你同意吗? - Kiran Challa
我当然同意。要想到这一点,我们并不需要“/”,“/ Home”和“/ Home / Index”指向同一页面。 “/“ 足够。我们有最后一对,因为路由以这种方式工作。只有一个使得册选更简单。因此,我会忽视它们,而不是首先提供它们。 - Robert Koritnik
当然 / 这就足够了,但我只是在展示你已经想做的事情,否则整个问题就不会出现了 - Kiran Challa
我不需要 "{action}" 我班上的路线。然后我就加入了 [Route("~/"), Route("index")] 我的方法。 - eth0


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

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

   public ActionResult ...
}

所以家庭控制器只能在root用户访问


0
2018-01-26 03:39



这是如何回答这个问题的?问题不是询问建议,而是如何做具体的事情...... - Robert Koritnik
没有其他选择 - 属性路由可替代旧式路由。我们应该总是推荐更好的方法,这样人们才能学到最多 - Asad Ali