为什么自定义路由控制器的方法上的 "Route" 属性是强制性的?
Why is mandatory the "Route" attribute on methods of a custom-routed controller?
考虑通过 Visual Studio 2017 模板创建的全新 Asp.Net Core 2.1 MVC Web 应用程序。现在,考虑一个自定义视图 (MyView) 和一个控制器 (ActualController),这样项目结构看起来类似于下图:
MyView
没有什么特别之处,而且离题了。但是,当用户输入 URL 类似 http://(domain)/desired/myview 或通过主页中的超链接输入时,该页面应该出现:
<a asp-area="" asp-controller="Desired" asp-action="MyView">MyView</a>
现在让我们关注控制器,它是一个 class 与路由预期的名称不同:
[Route("desired")]
public class ActualController : Controller
{
[Route("MyView")] //without this the method won't be called
public IActionResult MyView()
{
return this.View();
}
}
据我所知,通过使用 Route
属性装饰控制器,告诉 URL 解析器匹配此 class。但是,仅当我在目标 method/action 上显式添加(冗余)Route
属性时,映射才有效。如果我删除它,将找不到路径,并且服务器 returns 出现 404 错误。
问题是:为什么要强制用 Route
修饰方法,即使动作是由方法名称隐式定义的(像往常一样)?
注意:重命名控制器 class 对我来说相当简单,但我想知道这种行为背后的原因是什么。
您正在用 [Route("desired")]
覆盖 [controller]/[action]
的默认路由。由于您没有在控制器级别定义操作参数,因此所有其他路由都必须明确完成。
将顶部路由参数更改为[Route("desired/[action]")]
应该可以解决它,方法名称将用作参数。如果您想通过向它们添加 [Route("")]
属性来以不同的方式命名它们,您仍然可以覆盖单个操作。
另请参阅 docs (Token replacement in route templates) 以获取有关路由参数的更多说明
考虑通过 Visual Studio 2017 模板创建的全新 Asp.Net Core 2.1 MVC Web 应用程序。现在,考虑一个自定义视图 (MyView) 和一个控制器 (ActualController),这样项目结构看起来类似于下图:
MyView
没有什么特别之处,而且离题了。但是,当用户输入 URL 类似 http://(domain)/desired/myview 或通过主页中的超链接输入时,该页面应该出现:
<a asp-area="" asp-controller="Desired" asp-action="MyView">MyView</a>
现在让我们关注控制器,它是一个 class 与路由预期的名称不同:
[Route("desired")]
public class ActualController : Controller
{
[Route("MyView")] //without this the method won't be called
public IActionResult MyView()
{
return this.View();
}
}
据我所知,通过使用 Route
属性装饰控制器,告诉 URL 解析器匹配此 class。但是,仅当我在目标 method/action 上显式添加(冗余)Route
属性时,映射才有效。如果我删除它,将找不到路径,并且服务器 returns 出现 404 错误。
问题是:为什么要强制用 Route
修饰方法,即使动作是由方法名称隐式定义的(像往常一样)?
注意:重命名控制器 class 对我来说相当简单,但我想知道这种行为背后的原因是什么。
您正在用 [Route("desired")]
覆盖 [controller]/[action]
的默认路由。由于您没有在控制器级别定义操作参数,因此所有其他路由都必须明确完成。
将顶部路由参数更改为[Route("desired/[action]")]
应该可以解决它,方法名称将用作参数。如果您想通过向它们添加 [Route("")]
属性来以不同的方式命名它们,您仍然可以覆盖单个操作。
另请参阅 docs (Token replacement in route templates) 以获取有关路由参数的更多说明