C# ASP.NET MVC中动作方法与视图的隐式连接

C# ASP.NET MVC中动作方法与视图的隐式连接,c#,.net,asp.net-mvc,view,controller,C#,.net,Asp.net Mvc,View,Controller,我目前在VS2010的一个棕色地带ASP.NET MVC 3项目中工作 在此项目中,视图和控制器位于不同的项目中。这不是我以前见过的东西。在每个操作方法中,没有如下所示的视图名称的明确说明 return View("viewName",passingModel);//projects where controllers and views are in same 在VS2012中,我通过右键单击视图并执行addview,隐式地完成了这项工作。所以我并不担心action方法的返回视图和声明的视

我目前在VS2010的一个棕色地带ASP.NET MVC 3项目中工作

在此项目中,视图和控制器位于不同的项目中。这不是我以前见过的东西。在每个操作方法中,没有如下所示的视图名称的明确说明

return View("viewName",passingModel);//projects where controllers and views are in same 
在VS2012中,我通过右键单击视图并执行
addview
,隐式地完成了这项工作。所以我并不担心action方法的返回视图和声明的视图之间的联系在哪里

与VS2012不同,在VS2010中,我无法通过右键单击视图并执行
转到视图来导航到与某个特定操作方法相关的视图

我试图通过做这个小实验来理解这一点。我创建了一个
控制器
,创建了一个
操作方法
调用
xxxx
,我创建了一个视图,如上所述,并在整个解决方案中搜索了单词
xxxx
,但这个单词只出现在控制器和视图中

所以,我没有找到答案。我认为VisualStudio自己创建了自己的映射来实现这一点。 我想知道是谁在行动方法和视图之间创建了这些隐式连接,以了解我的项目中发生了什么

编辑:

包含控制器和视图的项目都是类库。不是asp.net mvc项目

Global.aspx
文件包含以下内容:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        protected void Application_Start()
        {
            DependenciesHelper.Register(new HttpContextWrapper(Context));

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RoutingHelper.RegisterRoutes(RouteTable.Routes);
        }

        protected void Application_End()
        {
            //Should close the index
            //If this method is not executed, the search engine will still work.
            SearchService.CloseIndex();
        }

映射相当简单。例如,如果您有一个名为“MyBrilliantController”的控制器和一个名为“MyExcellentAction”的操作方法,它只返回
返回视图()它将映射到(在UI项目中)
~/Views/MyBrilliant/MyExcellentAction.cshtml

<> P>唯一不同的是当你和“区域”一起工作时,但是映射是有效的,它只考虑区域文件夹(即:代码> ~/区域/ MyArea /视图/ MyPrime/MyExtExcActudi.cSHTML)

希望有帮助

编辑-您还可以在每个路由的global.asax文件中指定名称空间,以便引擎查找控制器

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

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { 
                controller = "Home", 
                action = "Index", 
                id = UrlParameter.Optional 
        }, // Parameter defaults
        new string[] {
            // namespaces in which to find controllers for this route
            "MySolution.MyControllersLib1.Helpers", 
            "MySolution.MyControllersLib2.Helpers",
            "MySolution.MyControllersLib3.Helpers" 
        } 
    );

}

我的理解是,按照惯例,如果你调用
视图
而没有视图名称,它将查找与动作同名的视图。@GeorgeDuckett你知道当控制器和视图在不同的项目中时,这种连接是如何发生的吗?你认为你与利物浦的对话涵盖了这一点,但基本上是以准确的方式发生的同样的方式。MVC代码将使用反射来查找相关的方法/类和配置的路由。非常感谢,如果控制器在单独的项目中会发生什么。正如我在编辑中所说的,它们都是类库。它将以完全相同的方式映射。这稍微取决于您的路由和区域注册(如果您使用的是区域),但您可以在1000个单独的DLL中拥有1000个控制器,并且在您告诉它之前,它仍将以默认方式进行映射。我不熟悉区域,在项目中,控制器分别位于一个文件夹中(文件夹未命名为
Controllers
,其名称为
Helpers
)。视图位于另一个项目中,但它们在“视图”文件夹和“控制器名称”文件夹下组织,然后在“视图”下组织。这是由文件夹结构自动检测到的,还是必须在
全局.aspx
中指定。很抱歉,我仍然无法理解此想法,:(忘记区域,控制器类区域的位置无关紧要-在ASP.NET MVC的“默认”工作方式中,它们只需在文件名的末尾加上“controller”一词(即
XxxxxController
),并继承自
System.Web.Mvc.Controller
。您还可以指定引擎在路由中查找控制器的名称空间-我将在上面添加一个示例。我现在明白了。控制器是这样标识的,那么视图是如何标识的。它只是使用文件夹结构吗?
Views->Controller->view.cshtml