【问题标题】:How does MVC/Razor engine find a view from a model?MVC/Razor 引擎如何从模型中找到视图?
【发布时间】:2017-09-13 22:03:38
【问题描述】:

鉴于我们有一个控制器方法只返回一个带有模型对象的 ViewResult,MVC 或 Razor 引擎如何继续查找要使用的 View,只给定 ViewResult? 例如

    public ActionResult Index()
    {
        return View( db.Persons.ToList());
    }

编辑:换句话说,一旦此方法返回,所有引擎必须继续运行的是 ViewResult。用于查找视图的任何内容都必须存储在此 ViewResult 中。

它是否使用 cshtml 文件顶部的绑定?

    @model IEnumerable<Database.Models.Person>

还是使用模型类的字符串名称,通过路由查找?

或者它真的记得哪个控制器调用了 View() 方法,并以此为基础?

还是别的什么?

对不起,如果这是一个明显的问题。我已经阅读了很多 Stackoverflow 问题和其他页面,但找不到使用哪种方式...我看到很多关于 URL 如何映射到控制器的讨论,但这不是我感兴趣的部分。

【问题讨论】:

  • 它使用约定。如果您不指定视图的名称,它将在 /Views/YourControllerName 文件夹中查找与方法名称匹配的 .cshtml 文件(如果未找到匹配项,它还会在 Shared 文件夹中查找。

标签: asp.net-mvc razor


【解决方案1】:

这与模型无关。 ViewEngine 在以下位置搜索视图。

  • ~/Views/{ControllerName}/{ActionName}.cshtml
  • ~/Views/{ControllerName}/{ActionName}.vbhtml
  • ~/Views/{ControllerName}/{ActionName}.aspx
  • ~/Views/{ControllerName}/{ActionName}.ascx

  • ~/Views/Shared/{ActionName}.cshtml
  • ~/Views/Shared/{ActionName}.vbhtml
  • ~/Views/Shared/{ActionName}.aspx
  • ~/Views/Shared/{ActionName}.ascx

默认情况下,视图名称是操作名称,除非您像这样指定视图名称:

return View(model, "ViewName");

您可以自定义搜索位置。你可以阅读here

更新:

控制器名称和动作名称将存储在RouteData 中。您可以像这样从RouteData 检索这些:

var controllerName = RouteData.Values["controller"].ToString();
var actionName = RouteData.Values["action"].ToString();

更新 2:

RouteData 也是ControllerContext 类的属性,ViewEngine 使用它来查找视图。查看IViewEngine接口hereFindView方法的定义。

【讨论】:

  • 好的,谢谢。但是控制器名称是如何存储在 ViewResult 中的呢?我在 ViewResult 中看不到任何可以存储控制器或其名称的内容。
  • RouteData 将包含控制器名称作为名称为“controller”的令牌。
  • @O'Rooney,内森回答了你的问题。我也将其包含在答案中。
  • 再次感谢,但 RouteData 是 Controller 上的属性,而不是 ViewResult 上的属性。我想我需要重写我的问题。
  • 我想简短的回答是 ViewResult 本身并不能识别要加载的内容,ViewEngine 也知道它来自哪个控制器。
猜你喜欢
  • 1970-01-01
  • 2017-10-15
  • 2011-03-11
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多