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 传统的编译方式一样,针对View的编译默认是基于目录的,也就是说同一个目录下的多个View文件被编译到同一个程序集中。

为了让读者对ASP.NET MVC对View文件的编译机制具有一个深刻的认识,我们通过一个简单的实例来确定View文件最终都被编译成什么类型,所在的程序集又是哪一个。我们在一个ASP.NET MVC应用中为HtmlHelper定义了如下一个扩展方法ListViewAssemblies,该方法用于获取当前被加载的包含View类型的程序集(程序集名称以“App_Web_”为前缀)。

   1: public static class HtmlHelperExtensions   2: {   3:     public static MvcHtmlString ListViewAssemblies(this HtmlHelper helper)   4:     {   5:         TagBuilder ul = new TagBuilder("ul");   6:         foreach(var assembly in AppDomain.CurrentDomain.GetAssemblies().Where(a=>a.FullName.StartsWith("App_Web_")))   7:         {   8:             TagBuilder li = new TagBuilder("li");   9:             li.InnerHtml = assembly.FullName;  10:             ul.InnerHtml+= li.ToString();  11:         }  12:         return new MvcHtmlString(ul.ToString());  13:     }  14: }

然后我们定义了如下两个Controller类型(FooController和BarController),它们之中各自定义了两个Action方法Action1和Action2。

   1: public class FooController : Controller   2: {   3:     public ActionResult Action1()   4:     {   5:         return View();   6:     }   7:     public ActionResult Action2()   8:     {   9:         return View();  10:     }  11: }  12:   13: public class BarController : Controller  14: {  15:     public ActionResult Action1()  16:     {  17:         return View();  18:     }  19:     public ActionResult Action2()  20:     {  21:         return View();  22:     }  23: }

接下来我们为定义在FooController和BarController的四个Action创建对应的View(对应文件路为:“~/Views/Foo/Action1.cshtml”、“~/Views/Foo/Action2.cshtml”、“~/Views/Bar/Action1.cshtml”和“~/Views/Bar/Action2.cshtml”)。它们具有如下相同的定义,我们在View中显示自身的类型和当前加载的基于View的程序集。

   1: <div>当前View类型:@this.GetType().AssemblyQualifiedName</div>   2: <div>当前加载的View程序集:</div>   3: @Html.ListViewAssemblies()

现在运行我们的程序并在浏览器中通过输入相应的地址“依次”(“Foo/Action1”、“Foo/Action2”、“Bar/Action1”和“Bar/Action2”)访问定义在FooController和BarController的四个Action,四次访问得到的输出结果下图所示。

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

时间: 2024-10-29 06:05:01

ASP.NET MVC的Razor引擎:View编译原理的相关文章

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引擎:RazorViewEngine

基于Web Form引擎的WebFormViewEngine和针对Razor引擎的RazorViewEngine都是抽象类型BuildManagerViewEngine的子类,而后者又继承自VirtualPathProviderViewEngine.在这里我们仅仅对实现在RazorViewEngine中View获取的逻辑进行简单介绍.由于Razor引擎下的View通过RazorView对象来表示,而RazorView通过View文件的虚拟路径来构建,所以RazorViewEngine的View获

ASP.NET MVC的Razor引擎:RazorView

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

一起谈.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 入门 5、View与ViewData

view在MVC模式中与用户进行最直接的接触,它负责数据的呈现.这里要注意 一点就是,view只是负责数据的呈现,所以我们应该要尽量让view中不涉及业务 逻辑的处理. 我们来添加一个Blog首页的view.在安装了ASP.NET MVC后 ,我们在添加新项目的时候可以看到有MVC的view模板: 注:如果你的是中文版的VS,安装完后可能会出现找不到这个模板的现 象,你可以参考在中文版VS 08中安装MVC这篇文章设置一下. 其中MVC View Content Page是有母版页的.我们在Vi

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日)

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/03/15/1984793.html   3月22日整理:实用示例请参考:这里 支持多国语言基本上是一个成熟产品必须支持的功能,但是直到想用这个功能时,发现居然找不到解决方案(很吃惊,真的没有提供么?),于是在网上搜索了好久,发现两种心仪的方案: 1: ASP.NET MVC 多语言解决方案 2: ASP.NET MVC - Localization Helpers 这两种方案都是针对WebForm