我已经打开了一个示例ASP.NET MVC项目。
在HomeController
中,我创建了一个名为MethodA
public ActionResult MethodA()
{
return View();
}
我右键点击MethodA
并创建了一个名为MethodA1
重做并创建了一个名为MethodA2
的新视图。
这种神奇的关系是如何完成的?我查找了配置,告诉编译器视图MethodAX
与操作MethodA
有关,但没有找到。
调用MethodA
时控制器会返回什么视图?
答案 0 :(得分:56)
约定是,如果未指定视图名称,则相应的视图将是操作的名称。所以:
public ActionResult MethodA()
{
return View();
}
将呈现~/Views/ControllerName/MethodA.cshtml
。
但您也可以指定一个视图名称:
public ActionResult MethodA()
{
return View("FooBar");
}
现在将呈现~/Views/ControllerName/FooBar.cshtml
视图。
或者您甚至可以指定一个完全限定的视图名称,该名称不在当前控制器的views文件夹中:
public ActionResult MethodA()
{
return View("~/Views/Foo/Baz.cshtml");
}
现在显然所有这些都假设Razor是视图引擎。如果您使用的是WebForms,请将.cshtml
替换为.aspx
或.ascx
(如果您正在使用部分内容)。
例如,如果没有视图,它甚至会告诉您查找视图的位置和顺序:
请记住:ASP.NET MVC完全是关于约定而不是配置。
答案 1 :(得分:11)
MVC框架使用约定优于配置。框架调用ViewResult对象上的ExecuteResult(由返回View();)创建。按照惯例,框架会在许多位置查找以查找视图
如果您正在使用区域,框架将在以下位置查看视图。
没有区域(或者如果您正在使用区域且未找到任何视图),框架将查看以下位置
只要Framework测试一个位置并找到一个文件,搜索就会停止, 并且已找到的视图用于呈现对客户端的响应。
View方法有许多覆盖版本。最常见的是通过名称调用框架约定之外的特定视图。例如
return View("~/Views/AnotherIndex.cshtml");
作为一个有趣的脚注,即使你有一个特定的视图引擎,框架也会查找遗留的ASP,C#和VB Razor视图(aspx,ascx,cshtml和vbhtml)。
答案 2 :(得分:0)
我一直在寻找同样的东西,我做了几个测试并想通了。 它不会保存在任何地方。 了解它是如何工作的;只需执行以下步骤:
在控制器中,右键单击“添加视图” 然后输入其他视图名称 和Ctrl F5 您将在应用程序中收到服务器错误。
例如,如果右键单击“在以下索引操作方法中添加视图”并在“视图名称”中键入“Index2”,则会收到错误。
public class TestController : Controller
{
// GET: Test
public ActionResult Index()
{
return View();
}
}
所以基本上动作名称和视图名称之间存在1-1匹配。并且您无法为同一方法添加视图,因此无需保存在配置文件中。
现在将Visual Studio中的视图文件名从Index2.cshtml更改为Index.cshtml,然后按Ctrl + F5。你应该看到它正在发挥作用。
答案 3 :(得分:0)
在MVC控制器中,操作未绑定到视图。 它使用委托机制来拾取视图。
模型绑定(映射)