首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么要强制自定义路由控制器的方法上的“路由”属性?

为什么要强制自定义路由控制器的方法上的“路由”属性?
EN

Stack Overflow用户
提问于 2018-10-23 08:49:40
回答 1查看 490关注 0票数 0

考虑一下通过VisualStudio2017模板创建的新的Asp.Net Core2.1MVCWeb应用程序。现在,考虑一个自定义视图(MyView)和一个控制器(ActualController),以便项目结构看起来类似于这幅图:

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

代码语言:javascript
复制
<a asp-area="" asp-controller="Desired" asp-action="MyView">MyView</a>

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

代码语言:javascript
复制
[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来修饰方法,甚至操作都是由方法名(通常情况下)隐式定义的?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 09:03:10

您正在使用[controller]/[action]重写[Route("desired")]的默认路由。由于您没有在控制器级别上定义操作参数,所以必须显式地执行所有其他路由。

将顶部路由参数更改为[Route("desired/[action]")]应该解决这个问题,方法名将用作参数。如果希望通过向单个操作添加[Route("")]属性来将它们命名为不同的名称,则仍然可以重写它们。

有关路由参数的进一步说明,请参见docs (路由模板中的令牌替换)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52944881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档