MVC如何知道调用哪个控制器,当他们没有注释

本文关键字:他们 注释 控制器 何知道 调用 MVC | 更新日期: 2023-09-27 18:15:44

第一次在stackexchange上回复邮件

我的问题不是关于aspx页面,而是关于asp.net core MVC6asp.net core可以不使用aspx页面,它使用Razor页面。另一个不删除这个问题的原因是为了帮助其他像我这样的学生,他们最终遇到了我基于这门课程的相同问题,因为我后来找到了合适的词语,有各种各样的网站,人们对此感到困惑,而我则熟练于这个新概念。我希望你能保留这个问题,更多的人跟随微软的在线课程可以偶然发现这个问题,因为在视频中它不是很清楚。(影片中讨论了很多事情,在所有其他解释中,这是一个相当大的问题)。

在本课程视频的某个点上,他们定义了一个响应URL的控制器。MVC以某种方式理解当你请求http://localhost/Scott时,它应该调用ScottController,然后返回"嘿,它是scott"。

控制器是这样的:

namespace WebApplication1.Controllers  // dont use controller minus S (controller) here 
{
    public class MariaController
    {
        public string Index() => "Hello from index mvc";
        public string Maria() => "Hello from Maria mvc";
    }
    public class ScottController
    {
        public string index()
        {
            return "hey it's scott";
        }
    } 
}

请注意,在上面的代码中没有[HttpGet("/Maria")][HttpGet("/Scott")]注释,然而不知何故,这段代码知道类ScottController应该响应/Scott URL,尽管它没有"name属性"或"Scott"值来检查。

它是与控制器类,名称"ScottController"被拆分和控制器被删除,所以MVc知道这是一个类,处理请求的/Scott URI?

MVC如何知道调用哪个控制器,当他们没有注释

这完全是另一种方式,所有都与路由有关。与站点相关的URI /Scott默认为以下路由值:

  • 控制器:斯科特
  • 行动:指数

这是因为约定。默认约定为/{controller}/{action},其中动作是可选的,默认为Index

所以当你请求/Scott时,MVC的路由将去寻找一个名为ScottController的控制器,这都是因为惯例。参见为什么MVC控制器必须有'Controller'类名的约定?

然后,由于请求uri中没有操作,它将尝试查找名为Index的默认操作,该操作返回"嘿,它是scott"。