ASP.NET MVC如何将视图关联到控制器操作?

43

我打开了一个示例ASP.NET MVC项目。

HomeController中,我创建了一个名为MethodA的方法(动作)。

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

我右键点击了MethodA,并创建了一个名为MethodA1的新视图。

然后我重新操作并创建了一个名为MethodA2的新视图。

  1. 这个神奇的关联是如何做到的?我查找了配置文件以告诉编译器视图MethodAX与操作MethodA相关,但没有找到。

  2. 当调用MethodA时,控制器将返回哪个视图?


2
如果你想知道 MVC 在哪里寻找 View,只需创建一个操作方法并忘记添加相应的 View 即可。 - Alex
1
你也可以添加自定义位置,以便从中搜索你的视图。这意味着你可以在 View/FolderName 下添加一个自定义文件夹结构,以使你的视图有组织地存储。请参阅 https://dev59.com/KnRB5IYBdhLWcg3wZmlz 了解如何实现。 - Graham
4个回答

59

按照惯例,如果您没有指定视图名称,则相应的视图将是该操作的名称。因此:

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

将渲染~/Views/ControllerName/MethodA.cshtml

但你也可以指定视图名称:

public ActionResult MethodA()
{
    return View("FooBar");
}

现在将呈现~/Views/ControllerName/FooBar.cshtml视图。

或者您甚至可以指定一个完全限定的视图名称,该名称不在当前控制器的视图文件夹中:

public ActionResult MethodA()
{
    return View("~/Views/Foo/Baz.cshtml");
}

显然,所有这些都是基于 Razor 作为视图引擎的假设。如果您使用的是 WebForms,请将 .cshtml 替换为 .aspx.ascx(如果您正在使用部分视图)。

例如,如果没有视图,它甚至会告诉您查找视图的顺序和位置:

enter image description here

记住:ASP.NET MVC 是一种约定优于配置的开发思想。


我仍然在想:当我将一个操作映射到非传统路径视图时,新的映射保存在哪里? - Elad Benda
它没有被保存在任何地方。你为什么认为它必须被保存在某个地方? - Darin Dimitrov
因为我的右键在操作上做了一些非传统的链接。应该在某个地方写下来,因为这是不寻常的。 - Elad Benda
如果你在谈论设计时间,那么你无法取消链接。内置向导遵循标准惯例。 - Darin Dimitrov
@DarinDimitrov 我在操作上使用了右键,并得到了如下视图:http://webmaster.org.il/articles/aspnetmvc-view-details(说明为希伯来语)。 - Elad Benda
记住:ASP.NET MVC 的核心是约定优于配置。这就是我认为应该始终牢记在心的。 - Amitya Narayan

11
MVC框架使用约定优于配置的方式。该框架调用ViewResult对象(由return View();创建)上的ExecuteResult方法。按照约定,框架会查找多个位置以寻找视图。
如果您正在使用区域,则框架将在以下位置查找视图:
- /Areas//Views/ControllerName/ViewName.aspx - /Areas//Views/ControllerName/ViewName.ascx - /Areas//Views/Shared/ViewName.aspx - /Areas//Views/Shared/ViewName.ascx - /Areas//Views/ControllerName/ViewName.cshtml - /Areas//Views/ControllerName/ViewName.vbhtml - /Areas//Views/Shared/ViewName.cshtml - /Areas//Views/Shared/ViewName.vbhtml
如果没有使用区域(或者正在使用区域但未找到视图),则框架将查找以下位置:
- /Views/ControllerName/ViewName.aspx - /Views/ControllerName/ViewName.ascx - /Views/Shared/ViewName.aspx - /Views/Shared/ViewName.ascx - /Views/ControllerName/ViewName.cshtml - /Views/ControllerName/ViewName.vbhtml - /Views/Shared/ViewName.cshtml - /Views/Shared/ViewName.vbhtml
一旦框架测试某个位置并找到文件,搜索就会停止,并使用已找到的视图来呈现响应给客户端。
View方法有许多重载版本,其中最常见的一个是按名称渲染特定视图,绕过框架约定。例如:
return View("~/Views/AnotherIndex.cshtml");
作为有趣的注脚,即使您使用了特定的视图引擎,该框架仍会查找遗留的ASP、C#和VB Razor视图(aspx、ascx、cshtml和vbhtml)。

如果您在没有视图名称的情况下使用View重写方法与使用视图名称的情况相比,性能是否会受到影响? - nam

1
在MVC中,控制器动作不与视图绑定。它使用委托机制来选择视图。
模型绑定(映射)

0
我也曾经寻找过同样的答案,最终通过测试找到了解决方法。 它并没有保存在任何地方。 要理解它的工作原理,请按照以下步骤操作:
在你的控制器中,右键点击,选择添加视图 然后输入不同的视图名称 按下Ctrl+F5 你会得到应用程序中的服务器错误。
例如,如果你在以下Index操作方法中右键点击,选择添加视图,并在视图名称中输入“Index2”,你将会得到这个错误。
public class TestController : Controller
{
    // GET: Test
    public ActionResult Index()
    {
        return View();
    }
}

基本上,操作名称和视图名称之间存在一对一的匹配。您不能为相同的方法添加视图,因此无需保存在配置文件中。

现在在Visual Studio中将视图文件名从Index2.cshtml更改为Index.cshtml,然后按Ctrl + F5。您应该看到它正在工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接