ASP.NET MVC 视图引擎

ASP.NET MVC中,需要处理两种主要类型的组件:

  • 控制器
    控制器负责执行请求并未原始后输入生成原始结果
  • 视图引擎
    视图引擎负责生成基于由控制器计算出的结果的任何预期的HTML响应

视图引擎的结构与性能

视图引擎是为浏览器实际生成HTML输出的组件,视图引擎负责为每个请求返回HTML,并且它通过将视图模板和由控制器传递进来的数据进行融合来准备其输出。

视图模板以一种引擎专用的标记语言来表示,其数据在字典或强类型对象中进行封装传递。

4933701-5fc73e17d697992b.png
控制器和视图引擎

视图引擎的机制

ASP.NET MVC中,视图引擎只是一个实现固定接口IViewEngine接口的类。

  1. 检测已注册的视图引擎

ViewEngines类是跟踪当前已安装引擎的系统资源库,仅公开了一个名为Engine的静态集合成员。该静态成员是由两个默认引擎初始化的。

public static class ViewEngines
{
  private static readonly ViewEngineCollection _engines = new ViewEngineCollection(new WebFormViewEngine(), new RazorViewEngine());

  public static ViewEngineCollection Engines
  {
      get{return engines;}
  }
  // 检测已安装引擎
  private static IList<String> GetRegisteredViewEngines()
  {
    return ViewEngines.Engines.Select(engine=>engine.ToString()).ToList();
  }
}

  1. 解析视图引擎

视图引擎是一个实现IViewEngine接口的类,该接口的协议表明其余引擎预期会提供的所有服务有关:引擎会以ASP.NET MVC基础架构的名义负责检索视图对象。视图对象代表了在ASP.NET MVC中构建实际HTML响应所需的所有信息的容器。

// IViewEngine接口
public interface IViewEngine
{
  // 创建并返回一个表示一段HTML代码的视图对象
  ViewEngineResult FindPartialView(ControllerContext controllerContext, String partialViewName, Boolean useCache);
  // 创建并返回一个表示HTML页面的视图对象
  ViewEngineResult FindView(ControllerContext controllerContext, String viewName, String masterName, Boolean useCache);
  // 释放指定的视图对象,释放视图对象已经使用过的所有引用。
  void ReleaseView(ControllerContext controllerContext, IView view);
}

FindPartialView和FindView都回返回一个ViewEngineResult对象,表示在服务器目录树周围找到一个用于视图的模板并将该模板实例化的结果。

public class ViewEngineResult
{
  // 搜索到的用来查找视图模板的位置列表
  // SearchedLocations属性的内容取决于所选视图引擎的结构和性能
  public IEnumerable<String> SearchedLocations {get; private set;}
  // 视图对象
  public IView View{get; private set;}
  // 用于创建视图对象的试图引擎对象
  public IViewEngine ViewEngine{get; private set;}
}
  1. 视图引擎的调用方是谁
4933701-9bb27fe31a14ee90.png
请求处理过程
  1. 视图对象

视图对象是实现IView接口的类的实例,视图对象的唯一目的是编写一些HTML响应到文本编辑器。每个视图都由名称来标识。视图名称同时也与某些定义了用于呈现HTML布局的物理文件相关联。视图名称与实际HTML布局两者之间的关联由视图引擎负责处理。

视图名称是控制器操作上View方法应该提供的参数之一,如果开发者没有显式地定义这样的参数,则系统会按照惯例假定视图名称与操作名称相同。

public interface IView
{
  void Render(ViewContext viewContext, TextWriter writer);
}

从内部来看,视图对象是一个封装器,封装了对没有数据的可视化布局进行描述的对象。视图呈现意味着以数据填充布局并将其以HTML的形式呈现给某些流。

视图模板定义

在ASP.MVC中,显示给用户的一切内容都由视图所产生,并依据模板文件进行描述。之后图形布局会转化为HTML,并通过一个或多个CSS文件设置样式,模板文件的写法取决于视图引擎。

模板解析

从获知视图名称开始,ViewResult对象会按照视图引擎出现在ViewEngines.Engines集合中的顺序,对所有已安装的视图引擎进行查询。每个视图引擎都会被检索以确定其是否有能力呈现一个给定名称的视图。

asp.net mvc 自定义视图引擎 public ThemeableRazorViewEngine() { AreaViewLocationFormats = new[] { //themes "~/Areas/{2}/Themes/{3}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Themes/{3}/Views/Shared/{0}.cshtml", //default "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml", }; AreaMasterLocationFormats = new[] { //themes "~/Areas/{2}/Themes/{3}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Themes/{3}/Views/Shared/{0}.cshtml", //default "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml", }; AreaPartialViewLocationFormats = new[] { //themes "~/Areas/{2}/Themes/{3}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Themes/{3}/Views/Shared/{0}.cshtml", //default "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml" }; ViewLocationFormats = new[] { //themes "~/Themes/{2}/Views/{1}/{0}.cshtml", "~/Themes/{2}/Views/Shared/{0}.cshtml", //default "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", //Admin //"~/Administration/Views/{1}/{0}.cshtml", //"~/Administration/Views/Shared/{0}.cshtml", }; MasterLocationFormats = new[] { //themes "~/Themes/{2}/Views/{1}/{0}.cshtml", "~/Themes/{2}/Views/Shared/{0}.cshtml", //default "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" }; PartialViewLocationFormats = new[] { //themes "~/Themes/{2}/Views/{1}/{0}.cshtml", "~/Themes/{2}/Views/Shared/{0}.cshtml", //default "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", //Admin //"~/Administration/Views/{1}/{0}.cshtml", //"~/Administration/Views/Shared/{0}.cshtml", }; FileExtensions = new[] { "cshtml" }; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值