使用ASP.NET MVC时,我们知道,要使用Views中的视图,需要在Action中写

return View();

这个方法返回的返回值是一个 ViewResult,进入这个类,继承了父类ViewResultBase后只写了MasterName属性和FindView方法。

不过已经开始看到到ViewEngine的踪影了。

        protected override ViewEngineResult FindView(ControllerContext context) {ViewEngineResult result = }
 

跟进ViewEngineCollection.FindView去看看。

来到了ViewEngineCollection类,这是一个实现了Collection<IViewEngine>的类。

        public virtual ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName) {if (controllerContext == null) {throw new ArgumentNullException("controllerContext");}if (string.IsNullOrEmpty(viewName)) {throw new ArgumentException(MvcResources.Common_NullOrEmpty, "viewName");}return Find(e => e.FindView(controllerContext, viewName, masterName, true),e => e.FindView(controllerContext, viewName, masterName, false));}
 

很简单的一个方法,跟进去

 
      private ViewEngineResult Find(Func<IViewEngine, ViewEngineResult> cacheLocator, Func<IViewEngine, ViewEngineResult> locator) {// First, look up using the cacheLocator and do not track the searched paths in non-matching view engines// Then, look up using the normal locator and track the searched paths so that an error view engine can be returnedreturn Find(cacheLocator, trackSearchedPaths: false)?? Find(locator, trackSearchedPaths: true);}private ViewEngineResult Find(Func<IViewEngine, ViewEngineResult> lookup, bool trackSearchedPaths) {// Returns//    1st result// OR list of searched paths (if trackSearchedPaths == true)// OR nullViewEngineResult result;List<string> searched = null;if (trackSearchedPaths) {searched = new List<string>();}foreach (IViewEngine engine in CombinedItems) {if (engine != null) {if (trackSearchedPaths) {searched.AddRange(result.SearchedLocations);}}}if (trackSearchedPaths) {// Remove duplicate search paths since multiple view engines could have potentially looked at the same pathreturn new ViewEngineResult(searched.Distinct().ToList());}else {return null;}}
 

乍一看,又是for又是if、else的有点不知所措,其实仔细一看结合上面的Find参数就能找到黄色加亮的几句代码关键代码。

是遍历了注册ViewEngine集合,调用ViewEngine各自的FindView,谁能找到View,就用谁。

那么遍历的ViewEngine集合怎么来的呢?要回到ViewResult的父类ViewResultBase中去看。

        public ViewEngineCollection ViewEngineCollection {get {return _viewEngineCollection ?? ViewEngines.Engines;}set {_viewEngineCollection = value;}}

如果没有定义那么就调用ViewEngines.Engines,这是一个很简单的静态类属性

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

回到刚才的遍历,由于RazorViewEngine的构造函数中定义了以下格式,在Views文件夹中也创建了相应的文件,所以选择了RazorViewEngine。

 AreaViewLocationFormats = new[] {"~/Areas/{2}/Views/{1}/{0}.cshtml","~/Areas/{2}/Views/{1}/{0}.vbhtml","~/Areas/{2}/Views/Shared/{0}.cshtml","~/Areas/{2}/Views/Shared/{0}.vbhtml"};
 

好了,终于找到了Razor。

转载于:https://www.cnblogs.com/llcto/archive/2012/06/02/2531470.html

[源码学习]调试Razor从哪里开始相关推荐

  1. ASP.NET Core 源码学习之Logging[1]:Introduction

    在ASP.NET 4.X中,我们通常使用 log4net, NLog 等来记录日志,但是当我们引用的一些第三方类库使用不同的日志框架时,就比较混乱了.而在 ASP.Net Core 中内置了日志系统, ...

  2. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  3. nginx源码学习资源

    nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...

  4. idea调试源代码c语言,IDEA阅读spring源码并调试

    目标:搭建起Spring源码阅读和代码调试跟踪的环境,顺便建立一个简单的Demo,能够调试Spring的源代码 本节,主要介绍一下Spring源码阅读和调试的相关环境搭建,并使用MVN创建一个非常简单 ...

  5. spring源码学习之整合Mybatis原理分析

    本文主要解析spring是如何与mybatis进行整合,整合的过程中需要哪些组件的支持.以前面提到过的配置例子<spring源码学习之aop事物标签解析> 整合的过程中需要使用以下这个依赖 ...

  6. Vue源码学习 - 组件化(三) 合并配置

    Vue源码学习 - 组件化(三) 合并配置 合并配置 外部调用场景 组件场景 总结 学习内容和文章内容来自 黄轶老师 黄轶老师的慕课网视频教程地址:<Vue.js2.0 源码揭秘>. 黄轶 ...

  7. VUE源码学习第一篇--前言

    一.目的 前端技术的发展,现在以vue,react,angular为代表的MVVM模式以成为主流,这三个框架大有三分天下之势.react和angular有facebook与谷歌背书,而vue是以一己之 ...

  8. Vue源码学习 - 组件化一 createComponent

    Vue源码学习 - 组件化一 createComponent 组件化 createComponent 构造子类构造函数 安装组件钩子函数 实例化 VNode 总结 学习内容和文章内容来自 黄轶老师 黄 ...

  9. php连接tidb,TiDB源码学习笔记:启动TiDB

    作者:院长,神州数码云基地开发工程师,目前专注于TiDB源码研究. TiDB源码研究系列第一篇,简述TiDB的核心架构,从tidb-server/mian.go开始,探索启动TiDB的方法. 最近因为 ...

最新文章

  1. PTA数据结构与算法题目集(中文)7-38
  2. 源码解读Dubbo分层设计思想
  3. __declspec(dllexport)的作用
  4. pytorch的梯度计算以及backward方法
  5. MAVEN 自定义骨架
  6. php5.5 session,(五)ThinkPHP实践之Session驱动-TTLSA
  7. c++中使用libxml2读取xml文件【转】
  8. Android tv开发px,【Android】TV端项目开发挖坑总结
  9. 退出整个Android程序的工具类
  10. 第七版自顶向下 第一章中文版 计算机网络课后习题答案
  11. 拥有PMP/ITIL/Prince2证书,你将享受这些国家福利
  12. nbminer内核附加参数详解
  13. QTableWidget获取一行数据
  14. [Python] python + selenium 抓取 京东商品数据(商品名称,售价,店铺,分类,订单信息,好评率,评论等)
  15. jQuery诞生记-原理与机制
  16. 个推平台API使用经验
  17. Teach-Repeat-Replan: A Complete and Robust System for Aggressive Flight in Complex Environments
  18. 【非广告】2021 入门级的 Java 程序员学习路线图 1.0
  19. win7+GTX1060配置及运行TensorFlow
  20. Folding@Home 常见问题解答

热门文章

  1. wxpython界面切换_wxpython实现按钮切换界面的方法
  2. java向指定文件继续写内容_java 向指定文件写入内容(如文件存在,则先删除再创建;写入如目录不存在,则创建)...
  3. linux修改文件没有备份文件,linux文件或目录权限修改后如何恢复(备份了权限就能恢复)...
  4. phpmyadmin忘记mysql密码_忘记phpmyadmin密码怎么重置
  5. 工业以太网交换机在实际应用中的优势
  6. 【渝粤教育】国家开放大学2019年春季 4有机合成单元反应 参考试题
  7. [渝粤教育] 广东-国家-开放大学 10763k2_客户服务管理_21秋考试
  8. 国家开放大学2021春1073法律文书答案
  9. http和php怎么交互,实现http与workerman的交互demo
  10. 建议把英语改成选修的计算机老师,越来越多的人建议高中将英语作为选修课,而非必修课,您认同吗?...