【问题标题】:How does ASP.Net MVC determine the view to use from a controller?ASP.Net MVC 如何从控制器确定要使用的视图?
【发布时间】:2012-12-14 17:14:04
【问题描述】:

我有一个返回 ActionResult 的控制器。具体来说,它在方法结束时调用return View(someViewModel)。这是方法签名:

protected ActionResult SomeControllerMethod(AViewModel someViewModel)

我随后从AViewModel (AnInheritedViewModel) 继承,向该类添加了一些新属性,现在将其传递给SomeControllerMethod

现在,在此方法末尾的 return 语句中,我收到一个关于如何找不到视图的错误。这很公平,但我不确定这一切默认情况下是如何工作的。

MVC 告诉我它正在寻找的视图名称不要与控制器方法或模型类型的名称对齐。按照相同的模式,也没有与原始模型名称对应的视图。所以我不确定 MVC 是如何决定要使用哪个视图的?

【问题讨论】:

    标签: asp.net-mvc-3 actionresult


    【解决方案1】:

    当你

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

    MVC 尝试查找名为“SomeControllerMethod.cshtml”的视图。它使用方法的名称作为查找视图文件的指南。

    您可以通过以下方式覆盖它:

    public ActionResult SomeControllerMethod()
    {
        return View("MyView");
    }
    

    因此 MVC 将尝试查找“MyView.cshtml”。

    【讨论】:

    • 这不只是将字符串“MyView”作为模型发送到 SomeControllerMethod.cshtml 吗?
    • 要发送模型,您可以使用:return View("MyView", myModelClass);
    • 谢谢 Jason(以及其他所有人)。如果(在我的情况下)调用是对View(model) 的调用——MVC 是否使用模型的类类型来确定要查找的视图?
    • 如果action方法被称为“Index”并且你调用return View(model),那么MVC将寻找一个名为“Index.cshtml”的视图并将model传递给它。
    【解决方案2】:

    还请务必注意/Views/Shared 中的视图(默认情况下,MVC 也会搜索此文件夹)。但最烦人的是当操作方法使用ActionNameAttribute 重命名时,例如:

    [ActionName("Bob")]
    public ActionResult MyMethod()
    {
        return View();
    }
    

    在这种情况下,MVC 将寻找一个名为“Bob”的视图。

    【讨论】:

      【解决方案3】:

      当用户在浏览器中输入 URL 时,MVC 应用程序使用 Global.asax 文件中定义的路由规则来解析 URL 并确定控制器的路径。然后控制器 确定处理请求的适当操作方法。经过 默认情况下,请求的 URL 被视为子路径,其中包括 控制器名称后跟动作名称。例如,如果一个 用户输入 URL http://contoso.com/MyWebSite/Products/Categories, 子路径是/P​​roducts/Categories。默认路由规则处理 “产品”作为控制器的前缀名称,必须以 “控制器”(如 ProductsController)。它将“类别”视为 动作的名称。因此,路由规则调​​用 Products 控制器的 Categories 方法,以便处理 要求。如果 URL 以 /Products/Detail/5 结尾,则默认路由 rule 将“Detail”视为操作的名称,Detail 方法 调用 Products 控制器来处理请求。经过 默认情况下,URL 中的值“5”将传递给 Detail 方法 作为参数。以下示例显示了一个控制器类 有一个 HelloWorld 操作方法。

      public class MyController : Controller
      {
          public ActionResult HelloWorld()
          {
              ViewData["Message"] = "Hello World!";
              return View();
          }
      }
      

      参考:http://msdn.microsoft.com/en-us/library/dd410269(v=vs.98).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多