asp.net mvc如何将视图与控制器动作联系起来?

Ela*_*nda 41 c# asp.net-mvc

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

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

public ActionResult MethodA()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

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

重新做了它并创建了一个名为的新视图MethodA2.

  1. 这种神奇的关系是如何完成的?我查找配置告诉编译器视图MethodAX与操作有关MethodA,但没有找到.

  2. MethodA调用时控制器将返回什么视图?

Dar*_*rov 57

惯例是,如果您未指定视图名称,则相应的视图将是操作的名称.所以:

public ActionResult MethodA()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

将呈现~/Views/ControllerName/MethodA.cshtml.

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

public ActionResult MethodA()
{
    return View("FooBar");
}
Run Code Online (Sandbox Code Playgroud)

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

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

public ActionResult MethodA()
{
    return View("~/Views/Foo/Baz.cshtml");
}
Run Code Online (Sandbox Code Playgroud)

现在显然所有这些都假设Razor是视图引擎.如果您使用的是WebForms,请替换.cshtml.aspx.ascx(如果您正在使用partials).

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

在此输入图像描述

请记住:ASP.NET MVC完全是关于约定优于配置.

  • 它是由Microsoft创建的,可以自动工作。 (2认同)

Ale*_*exC 11

MVC框架使用约定优于配置.框架调用ViewResult对象上的ExecuteResult(由返回View();)创建.按惯例,该框架然后在许多位置查找以查找视图

如果您正在使用区域,框架将在以下位置查看视图.

  • /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

只要Framework测试一个位置并找到一个文件,搜索就会停止,并且找到的视图将用于呈现对客户端的响应.

View方法有许多覆盖版本.最常见的是通过名称调用框架约定之外的特定视图.例如

return View("~/Views/AnotherIndex.cshtml");
Run Code Online (Sandbox Code Playgroud)

作为一个有趣的脚注,即使你有一个特定的视图引擎,框架也会查找遗留的ASP,C#和VB Razor视图(aspx,ascx,cshtml和vbhtml).