考虑一下通过VisualStudio2017模板创建的新的Asp.Net Core2.1MVCWeb应用程序。现在,考虑一个自定义视图(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来修饰方法,甚至操作都是由方法名(通常情况下)隐式定义的?
注意:对我来说重命名控制器类相当简单,但是我想知道这种行为背后的原因是什么。
发布于 2018-10-23 09:03:10
您正在使用[controller]/[action]重写[Route("desired")]的默认路由。由于您没有在控制器级别上定义操作参数,所以必须显式地执行所有其他路由。
将顶部路由参数更改为[Route("desired/[action]")]应该解决这个问题,方法名将用作参数。如果希望通过向单个操作添加[Route("")]属性来将它们命名为不同的名称,则仍然可以重写它们。
有关路由参数的进一步说明,请参见docs (路由模板中的令牌替换)。
https://stackoverflow.com/questions/52944881
复制相似问题