【问题标题】:Attribute routing in MVC 5 and optional defaultsMVC 5 中的属性路由和可选默认值
【发布时间】:2013-12-29 14:37:17
【问题描述】:

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

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

问题

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

【问题讨论】:

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


    【解决方案1】:

    是的,对..你所拥有的就是在这里做的......

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

    [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 部分是正确的。在这种情况下,我使用的是静态 URL 段而不是变量。真的。 我只是认为会有一些不那么冗长的方法来实现同样的事情。显然没有。你写的代码和我写的差不多……我希望少一些。 :)
    • 是的,但问题是您通常在整个应用程序中只有一个路由,您希望请求匹配GET /,因此只有在这种情况下才会冗长,并且对于应用程序的其余部分,您可以使用[RoutePrefix("Home")][Route("{action=Index}")]..这样的模式,您同意吗?
    • 我当然同意。想想看,我们真的不需要“/”、“/Home”和“/Home/Index”来指向同一个页面。 “/“ 足够的。我们有最后一对,因为路由曾经以这种方式工作。只有一个使封圣更容易。因此,我将不理会它们,并且一开始就不提供它们。
    • 当然 / 就足够了,但我只是在展示你已经想做的事情,否则整个问题都不会出现
    • 我的课堂上不需要"{action}" 路由。然后我在我的方法中添加了[Route("~/"), Route("index")]。
    【解决方案2】:

    现在对于 SEO,你应该使用规范的 url,意思是像这样的单个 url

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

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

    【讨论】:

    • 这是如何回答问题的?问题不是询问建议,而是如何做具体的事情......
    • 好吧,别无选择 - 属性路由是老式路由的替代方案。我们应该始终推荐更好的方法,以便人们能够学到最多
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2016-11-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多