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

时间:2012-03-27 20:13:41

标签: c# asp.net-mvc

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

HomeController中,我创建了一个名为MethodA

的方法(操作)
public ActionResult MethodA()
{
    return View();
}

我右键点击MethodA并创建了一个名为MethodA1

的新视图

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

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

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

4 个答案:

答案 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(如果您正在使用部分内容)。

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

enter image description here

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

答案 1 :(得分: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");

作为一个有趣的脚注,即使你有一个特定的视图引擎,框架也会查找遗留的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控制器中,操作未绑定到视图。 它使用委托机制来拾取视图。

模型绑定(映射)