MVC/Razor引擎如何从模型中查找视图?

O'R*_*ney 1 asp.net-mvc razor

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

    public ActionResult Index()
    {
        return View( db.Persons.ToList());
    }
Run Code Online (Sandbox Code Playgroud)

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

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

    @model IEnumerable<Database.Models.Person>
Run Code Online (Sandbox Code Playgroud)

或者它是否使用模型类的字符串名称并通过路由查找?

或者它实际上是否记得哪个控制器称为View()方法,并以此为基础?

或者是其他东西?

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

ata*_*ati 6

这与模型没有任何关系.将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");
Run Code Online (Sandbox Code Playgroud)

您可以自定义搜索位置.你可以在这里阅读.

更新:

控制器名称和操作名称将存储在RouteData.您可以通过以下方式检索RouteData以下内容:

var controllerName = RouteData.Values["controller"].ToString();
var actionName = RouteData.Values["action"].ToString();
Run Code Online (Sandbox Code Playgroud)

更新2:

RouteData也是ControllerContext类的属性,ViewEngine用于查找视图.在这里查看接口FindView方法的定义.IViewEngine

  • RouteData将控制器名称包含为名称为"controller"的标记. (2认同)