网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

ASP.NETMVC之视图引擎

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

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

ActionResult做了什么?

讲到视图引擎,不得不说ActionResult,因为在Controller中,我们看不到一点视图引擎的影子,唯一提供线索的只有ActionResult,所以我们必须先从AcionResult下手。

下面是ASP.NET MVC提供的所有的ActionResult类型的类图:

这其中用的最多的是ViewResult,ActionResult有一个抽象方法ExecuteResult,这个方法会向用户的请求中写入要输出的内容,比如Response.Write等操作。

最具代表性的ViewResult

在ASP.NET MVC中,ViewResult用的最多,Controller有一个View方法,它来实例化一个ViewResult对象,并返回。下面是View方法:

  1. protected internal virtual ViewResult View(string viewName, string masterName, object model) { 
  2.     if (model != null) { 
  3.         ViewData.Model = model; 
  4.     } 
  5.  
  6.     return new ViewResult { 
  7.         ViewName = viewName, 
  8.         MasterName = masterName, 
  9.         ViewData = ViewData, 
  10.         TempData = TempData 
  11.     }; 

它实例化一个ViewResult对象,并对其ViewData、TempData赋值,以完成从Controller向页面的传值。

ViewResult继承自ViewResultBase,ViewResult有一个IView类型的View属性,IView接口只有一个方法:

  1. public interface IView { 
  2.     void Render(ViewContext viewContext, TextWriter writer); 

因此,我们推测IView用于输出内容给用户。ViewResult类的ExecuteResult方法证明了这一点:

  1. public override void ExecuteResult(ControllerContext context) { 
  2.     if (context == null) { 
  3.         throw new ArgumentNullException("context"); 
  4.     } 
  5.     if (String.IsNullOrEmpty(ViewName)) { 
  6.         ViewName = context.RouteData.GetRequiredString("action"); 
  7.     } 
  8.     ViewEngineResult result = null
  9.     if (View == null) { 
  10.         result = FindView(context); 
  11.         View = result.View; 
  12.     } 
  13.     ViewContext viewContext = new ViewContext(context, View, ViewData, TempData); 
  14.     View.Render(viewContext, context.HttpContext.Response.Output); 
  15.     if (result != null) { 
  16.         result.ViewEngine.ReleaseView(context, View); 
  17.     } 

ASP.NET MVC的视图引擎

从上一小节中,看到要想得到IView对象,必须先有ViewEngineResult对象,而ViewEngineResult对象是通过ViewResult类的FindView方法得到的:

  1. protected override ViewEngineResult FindView(ControllerContext context) { 
  2.     ViewEngineResult result = ViewEngineCollection.FindView(context, ViewName, MasterName); 
  3.     if (result.View != null) { 
  4.         return result; 
  5.     } 
  6.  
  7.     // we need to generate an exception containing all the locations we searched 
  8.     StringBuilder locationsText = new StringBuilder(); 
  9.     foreach (string location in result.SearchedLocations) { 
  10.         locationsText.AppendLine(); 
  11.         locationsText.Append(location); 
  12.     } 
  13.     throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, 
  14.     MvcResources.Common_ViewNotFound, ViewName, locationsText)); 

从ViewResult类的FindView方法中,得知ViewEngineResult是通过ViewEngineCollection的FindView得到的,而ViewEngineCollection正是ViewEngines的静态属性Engines,Engines返回一个只有一个WebFormViewEngine类型实例的一个集合。所以,ViewEngineResult会是调用WebFormViewEngine类的FindView方法返回的结果。如果ViewEngins的静态属性Engines有多个ViewEngine提供,那么就依次遍历它们直到找到第一个不为空的ViewEngineResult为止。这样我们就可以在同一个MVC网站中使用多种视图引擎了。

在WebFormViewEngine的FindView方法返回之前,它会为ViewEngineResult注入一个IView类型的WebFormView实例,这样ViewEngineResult就作为一个中间人把IView类型给ViewResult了,然后ViewResult借助IView的力量,把数据输出给用户。

它们的关系是:

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师