ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 (2)

  从代码可以看出它是通过一个ViewEngineCollection对象,根据ViewName(默认是actionName)去查找View的,如果找到返回一个ViewEngineResult类型,否则将抛出异常,异常中包含查找的位置:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

   注:从上面的错误信息中可以看到ASP.NET MVC在查找View时,除了匹配了.cshtml和.vbhtml的文件外,还匹配了.aspx和.ascx的文件,后者是Web Form框架的页面文件,这是为什么呢?因为默认情况下ASP.NET MVC中会包含MVC使用的Razor 引擎和Web Form使用的Web Form引擎,所以在纯使用MVC开发的情况下,为了优化性能,一般会通过以下代码将Web Form的引擎删除:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

  更多View引擎的内容后续介绍。

ViewEngineCollection&ViewEngine

  在ASP.NET中有一个IViewEngine的接口,它定义了查找和释放View,其定义如下:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

  而ASP.NET中实现IViewEngine接口的类型关系如下图:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

  从该图中可以得到一下信息:
  ● ASP.NET中有两个最终实现的ViewEngine,分别是Razor和WebForm,MVC应用中使用Razor实现View的渲染。
  ● 它们的基类都是VirtualPathProviderViewEngine,就是说它们都是基于相对路径来管理View的。
  ● 它们的基类都是BuildManagerViewEngine,表面它们都和编译有关(注:在ASP.NET中无论是WebForm还是MVC,都可以在页面上编写代码,而这些代码肯定是不能被浏览器理解的,需要经过编译才能够正常工作)。

  ASP.NET中的ViewEngine被一个名为ViewEngines的集合进行管理,如下图:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

  MVC中主要使用的是RazorViewEngine,下图是RazorViewEngine的部分代码:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

  从代码中可以看到两个重要信息,第一是“_ViewStart”被硬编码为启动页面,这也是为什么在该页面指定布局的原因,另外在其构造方法中硬编码了各种LocationFormats,它们指定了相应类型页面的搜索路径

  那么上面提到的Razor又是什么呢?Razor是ASP.NET的一种可以将服务器代码嵌入到网页中的标记语言,它由Razor标记、服务器代码(C#/VB)以及Html代码组成。在Html中以@符号开始的内容将会被识别为服务器代码,而Razor将识别这些代码将其渲染为Html代码。更多关于Razor的内容可参考:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor

ViewEngineResult

  ViewEngineResult是ViewEngine对View查找后结果的封装,其定义如下:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

  它包含了查找后的结果IView类型以及用于查找的ViewEngine本身,另外还有一个字符串列表用来保存查找该View所遍历过的路径。
  下面是RazorViewEngine用来查找和创建RazorView对象的主要代码,其核心实际就是根据action名称和Controller名称与相应的LocationFormats匹配后查找文件是否存在,如果存在则创建IView实例的过程:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

  而这里的IView类型就是RazorView:

  

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

View的编译与激活

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgszy.html