【问题标题】:Why is mandatory the "Route" attribute on methods of a custom-routed controller?为什么自定义路由控制器的方法上的“Route”属性是强制性的?
【发布时间】:2018-10-23 17:08:10
【问题描述】:

考虑一个通过 Visual Studio 2017 模板创建的全新 Asp.Net Core 2.1 MVC Web 应用。现在,考虑一个自定义视图 (MyView) 和一个控制器 (ActualController),以便项目结构看起来类似于下图:

MyView 没有什么特别之处,而且离题了。但是,当用户输入http://(domain)/desired/myview 之类的 URL 或通过主页中的超链接时,该页面应该会出现:

<a asp-area="" asp-controller="Desired" asp-action="MyView">MyView</a>

现在让我们关注控制器,它是一个命名不同的类,与路由所期望的不同:

[Route("desired")]
public class ActualController : Controller
{
    [Route("MyView")]  //without this the method won't be called
    public IActionResult MyView()
    {
        return this.View();
    }
}

据我所知,通过使用Route 属性装饰控制器,可以告诉 URL 解析器匹配此类。但是,仅当我在目标方法/操作上显式添加(冗余)Route 属性时,映射才有效。如果我删除它,将找不到路径,并且服务器返回 404 错误。

问题是:为什么必须强制使用Route 装饰方法,即使操作是由方法名称隐式定义的(像往常一样)?

注意:重命名控制器类对我来说相当简单,但我想知道这种行为背后的原因是什么。

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc asp.net-mvc-routing


    【解决方案1】:

    您正在用[Route("desired")] 覆盖[controller]/[action] 的默认路由。由于您没有在控制器级别定义操作参数,因此所有其他路由都必须明确完成。

    将顶部路由参数更改为[Route("desired/[action]")] 应该可以解决它,并且方法名称将用作参数。如果您想通过向它们添加[Route("")] 属性来以不同的方式命名它们,您仍然可以覆盖单个操作。

    另请参阅docs (Token replacement in route templates) 以获取有关路由参数的进一步说明

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2017-07-03
      • 2014-09-17
      相关资源
      最近更新 更多