【问题标题】:how does asp.net mvc relate a view to a controller action?asp.net mvc 如何将视图与控制器操作相关联?
【发布时间】:2012-03-27 20:13:40
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 如果你想知道 ViewMVC 查找 的位置,只需创建一个操作方法并忘记添加对应的View ...
  • 您还可以为要搜索的视图添加自定义位置。这意味着您可以在View/FolderName 下添加自定义文件夹结构,以保持视图井井有条。请参阅stackoverflow.com/questions/632964/… 了解如何操作。

标签: c# asp.net-mvc


【解决方案1】:

约定是,如果您不指定视图名称,则相应的视图将是操作的名称。所以:

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(如果您使用的是部分表单)。

例如,如果没有视图,它甚至会告诉您在哪里以及以什么顺序查找视图:

记住:ASP.NET MVC 是关于约定优于配置的。

【讨论】:

  • 我仍然想知道:当我将一个动作映射到非对流路径视图时,新的映射保存在哪里?
  • 它无处保存。为什么你认为它必须保存在任何地方?
  • 因为我的右击动作做了一些非常规的联系。它应该写在某个地方,因为它是非常规的
  • 如果你在谈论设计时间,你不能取消链接。内置向导遵循标准约定。
  • @DarinDimitrov 我用右键单击动作并得到这样的视图webmaster.org.il/articles/aspnetmvc-view-details(解释是希伯来语)
【解决方案2】:

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)。

【讨论】:

  • 如果使用没有视图名称的视图覆盖方法,性能是否重要?有视图名称?
【解决方案3】:

在 MVC 控制器中,动作未绑定到视图。 它使用委托机制来获取视图。

模型绑定(映射)

【讨论】:

    【解决方案4】:

    我一直在寻找相同的东西,我只是做了几个测试并弄清楚了。 它不会保存在任何地方。 了解它是如何工作的;只需执行以下步骤:

    在您的控制器中,右键单击,添加视图 然后输入不同的视图名称 和 Ctrl F5 您将在应用程序中收到服务器错误。

    例如,如果您右键单击,在下面的索引操作方法中添加视图并在视图名称中键入“Index2”,您将收到错误。

    public class TestController : Controller
    {
        // GET: Test
        public ActionResult Index()
        {
            return View();
        }
    }
    

    所以基本上动作名称和视图名称之间存在 1-1 匹配。并且您不能为相同的方法添加视图,因此无需保存在配置文件中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 2014-02-25
      • 2013-12-11
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多