Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我执行ActionLink时,应用程序如何知道控制器类?ASP mvc_C#_Asp.net Mvc - Fatal编程技术网

C# 当我执行ActionLink时,应用程序如何知道控制器类?ASP mvc

C# 当我执行ActionLink时,应用程序如何知道控制器类?ASP mvc,c#,asp.net-mvc,C#,Asp.net Mvc,当我执行@Html.ActionLink(“关于我们”、“关于”、“主页”)时,应用程序如何知道控制器文件位于Controllers\HomeController.cs?我看到控制器文件夹是分开的,例如“视图\主页”、“视图\预订”等。但是,当指定的控制器名称是主页时,它如何知道如何查找控制器\ HomeController.cs?由于VisualStudio生成的文件,我的代码工作得非常好。然而,我想知道它背后的理论是什么。请解释一下,谢谢 这是我的路线配置 public static

当我执行
@Html.ActionLink(“关于我们”、“关于”、“主页”)
时,应用程序如何知道控制器文件位于
Controllers\HomeController.cs
?我看到控制器文件夹是分开的,例如“视图\主页”、“视图\预订”等。但是,当指定的控制器名称是
主页时,它如何知道如何查找
控制器\ HomeController.cs
?由于VisualStudio生成的文件,我的代码工作得非常好。然而,我想知道它背后的理论是什么。请解释一下,谢谢

这是我的路线配置

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
这是我的家庭控制器

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {            
        return View();
    }
}

本质上,这都是.NETMVC在做的。因此,当您向它提供ActionLink时,它知道“Home”是包含名为About的函数的控制器

当调用函数来呈现某些内容时;net mvc使用的DefaultControllerFactory将足够开始,以确定给定的控制器缺少“controller”一词,因此它将在调用之前追加该词

关于如何覆盖DefaultControllerFactory,我在过去使用过一个非常好的指南:


这可能会让你更好地了解引擎盖下发生的事情:)

事实并非如此。它只会生成链接
/Home/About
,而不关心该路由的控制器是否存在,如果存在,它来自哪个文件。它确实考虑了配置的路由。@CodeCaster我知道,我的
/home/About
是About.cshtml,这是否意味着它首先加载About.cshtml?出于某种原因,About.cshtml给出了控制器文件名?我已经更新了问题中的路线配置。请给你专家建议。谢谢连接在路由和控制器之间,视图不起作用,由控制器决定。在您的/home/About情况下,控制器由“home”决定,这是您路线的一部分。MVC有一些固定的规则,例如将带有控制器“Home”的路由转换为使用类HomeController(如果存在)的路由。您可以在默认路由中看到,URL的第一部分组成控制器名称,第二部分组成动作名称,最后一部分是调用动作时使用的参数。可能会有帮助。@user859385您必须深入了解MVC源代码。Afaik没有固定的“Home”=“HomeController”-映射。它是一个“=”控制器“-映射。最有可能是在标准MVC路由类中。如果您添加了另一个控制器,例如,将其命名为“HappyController”,并带有一个操作“Laugh”,则可以通过URL/Happy/Laugh访问该控制器。框架本身将“控制器”部分添加到类名中。谢谢!你的回答和@Dirk Trilsbeek评论帮了我的忙!很好的链接,了解引擎盖下的内容(: