ASP.NET MVC的Razor引擎:RazorViewEngine

基于Web Form引擎的WebFormViewEngine和针对Razor引擎的RazorViewEngine都是抽象类型BuildManagerViewEngine的子类,而后者又继承自VirtualPathProviderViewEngine。在这里我们仅仅对实现在RazorViewEngine中View获取的逻辑进行简单介绍。由于Razor引擎下的View通过RazorView对象来表示,而RazorView通过View文件的虚拟路径来构建,所以RazorViewEngine的View获取机制在于根据当前上下文找到与指定View名称相匹配的View文件(.cshtml或者.vbhtml文件),然后根据该 View文件的虚拟路径创建一个RazorView对象并最终封装成ViewEngineResult对象返回。

实现在RazorViewEngine中的目标View文件的搜索是根据一个预定义顺序进行的。如果当前请求不是针对某个Area的,下面的列表代表了View的搜索顺序:

~/Views/{ControllerName}/{ViewName}.cshtml

~/Views/{ControllerName}/{ViewName}.vbhtml

~/Views/Shared/{ViewName}.cshtml

~/Views/Shared/{ViewName}.vbhtml

对于针对某个Area的请求,RazorViewEngine会先按照如下的顺序对目标View进行搜索。如果在这个列表中没有成功找到目标View文件,会继续按照上面的属性进行搜索。

~/Areas/{AreaName}/Views/{ControllerName}/{ViewName}.cshtml

~/Areas/{AreaName}/Views/{ControllerName}/{ViewName}.vbhtml

~/Areas/{AreaName}/Views/ Shared /{ViewName}.cshtml

~/Areas/{AreaName}/Views/ Shared /{ViewName}.vbhtml

如果按照上面的搜索顺序依然找不目标View文件,RazorViewEngine会根据这个列表创建并返回一个ViewEngineResult对象。这里介绍的View搜索机制不仅仅应用于普通的View文件,还应用于Partial View和布局文件的搜索。

ViewEngine不仅仅通过FindView/FindPartialView根据当前上下文获取指定的View,还通过ReleaseView对指定的View进行释放回收操作。ReleaseView方法在RazorViewEngine的实现很简单,如果指定的View对象的类型实现IDispose接口,它会直接调用其Dispose方法。下图所示的UML体现了Razor引擎涉及的相关类型/接口以及它们之间的相互关系。

在《ASP.NET MVC的Razor引擎:RazorView》一文中我们创建了一个用于模拟RazorView的SimpleRazorView,现在我们为它创建一个对应的RazorViewEngine,我们直接在该实例项目中添加如下一个SimpleRazorViewEngine。

   1: public class SimpleRazorViewEngine: IViewEngine   2: {   3:     private string[] viewLocationFormats = new string[] {   4:         "~/Views/{1}/{0}.cshtml",   5:         "~/Views/{1}/{0}.vbhtml",   6:         "~/Views/Shared/{0}.cshtml",   7:         "~/Views/Shared/{0}.vbhtml" };   8:     private string[] areaViewLocationFormats = new string[] {   9:         "~/Areas/{2}/Views/{1}/{0}.cshtml",  10:         "~/Areas/{2}/Views/{1}/{0}.vbhtml",  11:         "~/Areas/{2}/Views/Shared/{0}.cshtml",  12:         "~/Areas/{2}/Views/Shared/{0}.vbhtml" };  13:  14:     public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)  15:     {  16:         return FindView(controllerContext, partialViewName, null, useCache);  17:     }  18:   19:     public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)  20:     {  21:         string controllerName = controllerContext.RouteData.GetRequiredString("controller");  22:         object areaName;  23:         List<string> viewLocations = new List<string>();  24:         Array.ForEach(viewLocationFormats, format => viewLocations.Add(string.Format(format, viewName, controllerName)));  25:         if (controllerContext.RouteData.Values.TryGetValue("area", out areaName))  26:         {  27:             Array.ForEach(areaViewLocationFormats, format=>viewLocations.Add(string.Format(format,viewName,controllerName, areaName)));  28:         }  29:         foreach (string viewLocation in viewLocations)  30:         {  31:             string filePath = controllerContext.HttpContext.Request.MapPath(viewLocation);  32:             if (File.Exists(filePath))  33:             {  34:                 return new ViewEngineResult(new SimpleRazorView(viewLocation),  35:                     this);  36:             }  37:         }  38:         return new ViewEngineResult(viewLocations);  39:     }  40:   41:     public void ReleaseView(ControllerContext controllerContext, IView view)  42:     {  43:         IDisposable disposable = view as IDisposable;  44:         if (null != disposable)  45:         {  46:             disposable.Dispose();  47:         }  48:     }  49: }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 文件
, view
, cshtml
, indexqtqlist view
, AREAS
, RazorViewEngine
, view文件夹
当前view
,以便于您获取更多的相关知识。

时间: 2024-11-02 15:41:42

ASP.NET MVC的Razor引擎:RazorViewEngine的相关文章

ASP.NET MVC的Razor引擎:IoC在View激活过程中的应用

在<ASP.NET MVC的Razor引擎:RazorView>介绍BuildManagerCompiledView的时候,我们谈到默认使用的ViewPageActivator使用当前注册的DependencyResolver来完成对目标View的激活,这意味着我们可以通过注册自定义DependencyResolver的方式实现基于IoC的View激活.本篇文章中我们将演示如何通过自定义View的方式实现与IoC框架Ninject的集成. 我们定义了一个具有如下定义的NinjectDepend

ASP.NET MVC的Razor引擎:RazorView

Razor引擎具有两个核心的类型,一个是表示View本身的类型RazorView,另一个则是获取和创建它的RazorViewEngine,我们将用两篇文章对它们分别进行剖析.Razor引擎下的View通过类型RazorView表示,它与表示Web Form引擎View的类型WebFormView都是BuildManagerCompiledView的子类. 一.BuildManagerCompiledView 为了能够清楚地说明实现在BuildManagerCompiledView中的View激活

ASP.NET MVC的Razor引擎:View编译原理

通过.cshtml或者.vbhtml文件定义的View能够被执行,必须先被编译成存在于某个程序集的类型,ASP.NET MVC采用动态编译的方式对View文件实施编译.当我们在对ASP.NET MVC进行部署的时候,需要对.cshtml或者.vbhtml文件进行打包.针对某个View的第一次访问会触发针对它的编译,一个View对应着一个类型.我们可以对.cshtml或者.vbhtml进行修改,View文件修改后的第一次访问将会导致View的再一次编译.和ASP.NET 传统的编译方式一样,针对V

ASP.NET MVC 3: Razor中的@:和语法

原文 ASP.NET MVC 3: Razor中的@:和语法 [原文发表地址] ASP.NET MVC 3: Razor's @: and <text> syntax[原文发表时间] December 15, 2010 11:48 PM 这是我正在写的博文系列中的另一篇,涵盖ASP.NET MVC 3的一些新功能: ·        Razor中的新@模型关键字(10月19日) ·        Razor中的层(10月22日) ·        用Razor实现服务器端注释(11月12日)

一起谈.NET技术,ASP.NET MVC之视图引擎

最近微软发布了另外一个在ASP.NET MVC上应用的视图引擎Razor.通过前面一系列的探讨,我想大部分都了解了ASP.NET MVC整个的原理,包括TempData.ViewData.ModelBinding.Filter等,但是我们还不是太了解它的视图引擎的情况.ASP.NET MVC的视图引擎具有非常好的扩展性,我们可以使用其它的视图引擎代替WebForm,或是同时使用多种试图引擎,这些都得益于ASP.NET MVC精美的设计,下面我们一起来观赏一下它的设计. 内容概览: ActionR

ASP.NET MVC之视图引擎

最近微软发布了另外一个在ASP.NET MVC上应用的视图引擎Razor.通过 前面一系列的探讨,我想大部分都了解了ASP.NET MVC整个的原理,包括TempData.ViewData.ModelBinding.Filter等, 但是我们还不是太了解它的视图引擎的情况.ASP.NET MVC的视图引擎具有非常好的扩展性,我们可以使用其它的视图引擎代替WebForm,或是同时使用多种试图引擎,这些都得益于ASP.NET MVC精美的设计,下面我们一起来观赏一下它的设计. 内容概览: Actio

ASP.NET MVC:Razor 引入命名空间

原文:ASP.NET MVC:Razor 引入命名空间 页面中引用 c# @using MvcApplication83.Models @using MvcApplication83.Common 行尾不需要加分号,加上也无妨(不过得全加上). VB.Net @Imports MvcApplication83.Models @Imports MvcApplication83.Common 配置文件中引用 必须在 Views 文件夹中的 Web.config 文件中添加引用.见下图: 打开该文件,

ASP.NET MVC 3 Razor 表单还能再直观点

转自http://www.cnblogs.com/think8848/archive/2011/09/14/2175432.html   转载请注明作者(think8848)和出处(http://think8848.cnblogs.com) 依照本人惯例,开篇先说些与主题无关的话:本来打算把写博客的这个习惯坚持下去,就算不能出精品,也能出一些水货,对于某些小问题提供点解决方案,但是今年的8月真可谓是多事之"秋",很多事情都凑到一起去了,几乎没有时间学习新的东西,更别说去写博客了,9月眼

ASP.NET MVC 3 Razor 多国语言参考解决方案 补充四

转自 http://www.cnblogs.com/think8848/archive/2011/07/05/2098464.html   前四回(1,2,3,4)介绍了在ASP.NET MVC 3使用Razor ViewEngine时实现多国语言的解决方案,本以为就够用了,没料到今天居然在使用时又遇到新问题了. 先说需求,最近做了一套全新的页面样式,基本思路是在iframe中显示内容,那么毫无疑问,这些内容页就是MVC的视图了,但是主页以何种形式存在呢?.html?.cshtml?.aspx?