首页 / 网页编程 / ASP.NET / 学习ASP.NET MVC(五) ViewEngine 深入解析与应用实例
        
            学习ASP.NET MVC(五) ViewEngine 深入解析与应用实例2011-10-14 cnblogs ziqiu.zhang一.摘要本文讲解ViewEngine的作用, 并且深入解析了实现ViewEngine相关的所有接口和类, 最后 演示了如何开发一个自定义的ViewEngine. 本系列文章已经全部更新为ASP.NET MVC 1.0版本.希望大家多 多支持!二.承上启下首先注意: 我会将大家在MVC之前一直使用的ASP.NET页面编程模型称作ASP.NET WebForm编程模型.上一讲中我们已经学习了如何向View传递Model, 以及如何在View中使用Model对象. 目前为止我们使 用的都还是ASP.NET WebForm的页面模型,比如aspx页面,用户控件,母版页等. 最后这些页面中都要转换为 HTML代码. 比如页面中的内嵌代码:<% = ViewData["model"] %>你是否思考过, 为何页面会支持<% %>这种语法? 为何最后一个aspx页面会在浏览器中以HTML代码的形式展现?有人会回答这是ASP.NET自带的语法和功能. 没有错, ASP.NET帮我们做了编译页面, 输出HTML, 返回 HTML给客户端浏览器等一系列工作.但是这些工作在MVC框架中有很多是属于View角色的职责. 为了继续使 用原有的ASP.NET WebForm页面引擎, ASP.NET MVC抽象出来了ViewEngine这个角色. 顾名思义ViewEngine 即视图引擎, 其主要作用就是找到View对象, 编译View对象中的语言代码(执行语言逻辑), 并且输出 HTML. 下面讲解的WebFormViewEngine就是使用ASP.NET WebForm的页面编译/呈现功能实现的.三.ViewEngine解析下面将讲解和ViewEngine有关的各个接口和类.IView接口IView接口是对MVC结构中View对象的抽象, 此接口只有一个方法:void Render(ViewContext viewContext, TextWriter writer);Render方法的作用就是展示View对 象, 通常是将页面HTML写入到Writer中供浏览器展示.在本系列第三篇文章中我曾经分析过, 虽然IView对象是MVC中View角色的抽象, 并且提供了Render方 法, 但是实际上真正的View角色的显示逻辑在ViewPage/ViewUserControl类中. 这是由于ASP.NET MVC提 供的WebFormViewEngine视图引擎是使用原有的ASP.NET Web From的页面显示机制, 我们无法直接将 WebForm模型中的页面转化为IView对象.于是最后使用了一个折中的办法:在IView对象的Render方法中调用WebForm页面的Render方法. WebFormView是目前ASP.NET MVC中唯一 实现了IView接口的类所以如果我们使用自定义的ViewEngine引擎, 就可以直接创建一个实现了IView接口的类实现Render方 法.IViewEngine接口ViewEngine即视图引擎, 在ASP.NET MVC中将ViewEngine的作用抽象成了 IViewEngine 接口.虽然IViewEngine的职责是寻找View对象, 但是其定义的两个方法:FindPartialViewFindView返回的结果是ViewEngineResult对象, 并不是View对象. 我们可以将 ViewEngineResult理解为一次查询的结果, 在ViewEngineResult对象中包含有本次找到的IView对象.ASP.NET MVC 提供了下面两个实现了IViewEngine接口的类:VirtualPathProviderViewEngine