ASP.NET MVC的View是如何呈现出来的[实例篇]

在《[设计篇]》篇中我们通过对View引擎的总体介绍讲述了从ViewResult的创建到View呈现的原理,为了让读者对View引擎及其View呈现机制具有一个深刻的认识,我们自定义一个简单的用于呈现静态HTML的StaticFileViewEngine。在一个通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中,我们定义了如下一个针对于静态HTML内容呈现的自定义StaticFileView。StaticFileView实现了IView接口,在实现的Render方法中读取制定文件的内容写入作为参数的TextWriter。

   1: public class StaticFileView:IView   2: {   3:     public string FileName { get; private set; }   4:     public StaticFileView(string fileName)   5:     {   6:         this.FileName = fileName;   7:     }   8:     public void Render(ViewContext viewContext, TextWriter writer)   9:     {  10:         byte[] buffer;  11:         using (FileStream fs = new FileStream(this.FileName, FileMode.Open))  12:         {  13:             buffer = new byte[fs.Length];  14:             fs.Read(buffer, 0, buffer.Length);  15:         }  16:         writer.Write(Encoding.UTF8.GetString(buffer));  17:     }  18: }

由于StaticFileView中定义的内容完全是静态的,所以缓存显得很有必要。我们只需要基于Controller和View名称对View实施缓存,为此我们定义了如下一个作为Key的数据类型ViewEngineResultCacheKey。

   1: internal class ViewEngineResultCacheKey   2: {   3:     public string ControllerName { get; private set; }   4:     public string ViewName { get; private set; }   5:   6:     public ViewEngineResultCacheKey(string controllerName, string viewName)   7:     {   8:         this.ControllerName = controllerName ?? string.Empty;   9:         this.ViewName = viewName ?? string.Empty;  10:     }  11:     public override int GetHashCode()  12:     {  13:         return this.ControllerName.ToLower().GetHashCode() ^ this.ViewName.ToLower().GetHashCode();  14:     }  15:  16:     public override bool Equals(object obj)  17:     {  18:         ViewEngineResultCacheKey key = obj as ViewEngineResultCacheKey;  19:         if (null == key)  20:         {  21:             return false;  22:         }  23:         return key.GetHashCode() == this.GetHashCode();  24:     }  25: }

具有如下定义的StaticFileViewEngine代表StaticFileView对应的ViewEngine。我们通过一个字典类型的字段viewEngineResults作为对ViewEngineResult的缓存,而View的获取操作最终实现在InternalFindView方法中。通过StaticFileView表示的View定义在一个以View名称作为文件名的文本文件中,该文件的扩展名为.shtml(Static HTML)。

   1: public class StaticFileViewEngine : IViewEngine   2: {   3:     private Dictionary<ViewEngineResultCacheKey, ViewEngineResult> viewEngineResults = new Dictionary<ViewEngineResultCacheKey, ViewEngineResult>();   4:     private object syncHelper = new object();   5:     public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)   6:     {   7:         return this.FindView(controllerContext, partialViewName, null, useCache);   8:     }   9:  10:     public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)  11:     {  12:         string controllerName = controllerContext.RouteData.GetRequiredString("controller");  13:         ViewEngineResultCacheKey key = new ViewEngineResultCacheKey(controllerName, viewName);  14:         ViewEngineResult result;  15:         if (!useCache)  16:         {  17:             result = InternalFindView(controllerContext, viewName, controllerName);  18:             viewEngineResults[key] = result;  19:             return result;  20:         }  21:         if(viewEngineResults.TryGetValue(key, out result))  22:         {  23:             return result;  24:         }  25:         lock (syncHelper)  26:         {  27:             if (viewEngineResults.TryGetValue(key, out result))  28:             {  29:                 return result;  30:             }  31:  32:             result = InternalFindView(controllerContext, viewName, controllerName);  33:             viewEngineResults[key] = result;  34:             return result;  35:         }  36:     }  37:  38:     private ViewEngineResult InternalFindView(ControllerContext controllerContext, string viewName, string controllerName)  39:     {  40:         string[] searchLocations = new string[]  41:         {  42:             string.Format( "~/views/{0}/{1}.shtml", controllerName, viewName),  43:             string.Format( "~/views/Shared/{0}.shtml", viewName)  44:         };  45:  46:         string fileName = controllerContext.HttpContext.Request.MapPath(searchLocations[0]);  47:         if (File.Exists(fileName))  48:         {  49:             return new ViewEngineResult(new StaticFileView(fileName), this);  50:         }  51:         fileName = string.Format(@"\views\Shared\{0}.shtml", viewName);  52:         if (File.Exists(fileName))  53:         {  54:             return new ViewEngineResult(new StaticFileView(fileName), this);  55:         }  56:         return new ViewEngineResult(searchLocations);  57:     }  58:  59:     public void ReleaseView(ControllerContext controllerContext, IView view)  60:     { }  61: }

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

时间: 2024-11-05 14:30:34

ASP.NET MVC的View是如何呈现出来的[实例篇]的相关文章

返璞归真 asp.net mvc (4) - View/ViewEngine

原文:返璞归真 asp.net mvc (4) - View/ViewEngine[索引页][源码下载] 返璞归真 asp.net mvc (4) - View/ViewEngine 作者:webabcd 介绍 asp.net mvc 之 View 和 ViewEngine ViewData 和 TempData 都可以向 View 传递数据,其中 TempData 是保存在 Session 中的,一次请求后此 Session 会被清除 HtmlHelper - 在 View 中显示 HTML

ASP.NET MVC的View是如何被呈现出来的?[设计篇]

在前面的四篇文章中,我们介绍了各种ActionResult以及相关的请求响应机制,但是与"View的呈现"相关的ActionResult是ViewResult.通过ViewResult的执行实现的对View的呈现比上面我们介绍的各种ActionResult要复杂得多,ASP.NET MVC内部设计了一个扩展的View引擎实现了最终的View呈现工作.[本文已经同步到<How ASP.NET MVC Works?>中] 一.View引擎中的View ASP.NET MVC为我

学习ASP.NET MVC(四) View/Model 全解

一.摘要 本文讲解在Action中向View传递Model的几种方式.以及View获取Model以后如何编写显示逻辑.还详细 的介绍了ASP.NET MVC框架提供的Html Helper类的使用及如何为Html Helper类添加自定义扩展方法. 二.承上启下 上一篇文章中我们学习了Controller处理一次请求的全过程.在Controller的Action中, 会传递数据给 View,还会通知View对象开始显示.所以Model是在Action中获取的, 并由Action传递给View.

学习ASP.NET MVC(三) Controller/Action 深入解析与应用实例

一.摘要 一个Url请求经过了Routing处理后会调用Controller的Action方法. 中间的过程是怎样的? Action方 法中返回ActionResult对象后,如何到达View的? 本文将讲解Controller的基本用法, 深入分析 Controller的运行机制, 并且提供了创建所有类型Action的代码. 值得学习ASP.NET MVC时参考. 二.承上启下 在上一篇文章中, 我已经学会了如何使用Routing获取Controller和Action, 随后的程序会调用 Co

Asp.Net Mvc Beta新特性之自动绑定(1)-体验篇

我们知道,在Asp.Net Mvc Preview5中加入了全新的ModelBinder特性,虽然这个特性非常的强大,但是使用起来并不是那么的友好,因此,在最新的Asp.Net Mvc Beta中,框架对这部分进行了进一步的加强,使得复杂参数的自动绑定得以实现,本文将分级部分完整探讨整个mvc框架中的modelbinder实现和完全挖掘系统自带的ModelBinder的能力,使得基于mvc框架的web开发脱离页面取值的苦海. (参见: http://www.cnblogs.com/leven/a

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自己管理自己的View:ASP.NET MVC File Management

频繁的与美工交接,频繁的通过FTP.远程连接上传文件,哪怕是改一个字节都要传一次服务器.日常 开发中有太多的很烦很烦的界面修改,于是我之前做了ASP.NET MVC View Management,用于管理服务器 上ASP.NET MVC中View文件的小改动,不过后来又感觉到有些配置文件有时也要修改,于是将其扩展至上 一层,使之能管理更多的文件. 在这个项目中,我没有考虑过多的安全问题与文件是否可编辑的问题,因为我是假定系统管理員在了 解系统的情况下,去使用的,而且系统管理員也可以很好地将这个

ASP.NET MVC的运行机制

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.

ASP.NET MVC学习笔记_实用技巧

网上关于ASP.NET MVC的系列教程有好几个,所以就不从头开始介绍了,结尾处给大家推荐了几个链接,需要的话可以从头系统的看看. 1.ASP.NET MVC介绍及与ASP.NET WebForm的区别 刚开始为了搞清楚ASP.NET MVC到底值不值得用,翻来覆去想了一个多礼拜,看了好多资料和评论,最后决定还是值得一用.MVC不是一个简单的设计模式,更像一种架构模式,或者一种思想,刚开始一听MVC想到的就是模板引擎,NVelocity,StringTempleate等,但感觉如果只是为了用模板