MvcHandler.ProcessRequest()

 

(1)获取Action执行结果:context2.Result

ActionExecutedContext context2 = this.InvokeActionMethodWithFilters(controllerContext, filters.ActionFilters, actionDescriptor, parameterValues
 
this.InvokeActionResultWithFilters(controllerContext, filters.ResultFilters, context2.Result);
 
(2)InvokeActionResultWithFilters()方法中:
this.InvokeActionResult(controllerContext, actionResult);
actionResult.ExecuteResult(controllerContext);
 如果是创建视图,实则执行:ViewResultBase.ExecuteResult();

(3)ViewResultBase.ExecuteResult()方法中:


ViewResultBase.
ExecuteResult()方法中:(找到视图引擎,找到视图)
result = this.FindView(context);
this.View = result.View;
实则执行:ViewResult.FindView()
(4)ViewResult.FindView()方法中:
ViewResult.FindView()方法中:
ViewEngineResultresult = base.ViewEngineCollection.FindView(context, base.ViewName, this.MasterName);
 
ViewResultBase属性 ViewEngineCollection

publicViewEngineCollectionViewEngineCollection
{
get
{
return (this._viewEngineCollection ?? ViewEngines.Engines);
// ViewEngines.Engines为静态ViewEngineCollection类型
       //静态构造函数中 为ViewEngineCollection中添加了两个视图引擎对象(WebFormViewEngine,RazorViewEngine)
}
set
{
this._viewEngineCollection = value;
}
}

(5)
ViewEngineCollection.FindView()方法:

publicvirtualViewEngineResultFindView(ControllerContextcontrollerContext, stringviewName, stringmasterName)
{
if (controllerContext == null)
{
thrownewArgumentNullException("controllerContext");
}
if (string.IsNullOrEmpty(viewName))
{
thrownewArgumentException(MvcResources.Common_NullOrEmpty, "viewName");
}
returnthis.Find(e => e.FindView(controllerContext, viewName, masterName, true), (Func<IViewEngine, ViewEngineResult>) (e => e.FindView(controllerContext, viewName, masterName, false)));
//e.FindView()为 IViewEngine.FindView()
}
 

(6)IViewEngine.FindView()方法:
如果为WebFormViewEngine、RazorViewEngine类,调用其父类的FindView()方法
 
FindView() 返回 ViewEngineResult类型


ViewEngineResult:(包含IView、IViewEngine类型的两个属性)
publicclassViewEngineResult
{
// MethodspublicViewEngineResult(IEnumerable<string> searchedLocations);
publicViewEngineResult(IViewview, IViewEngineviewEngine); // PropertiespublicIEnumerable<string> SearchedLocations { get; privateset; }
publicIViewView { get; privateset; }
publicIViewEngineViewEngine { get; privateset; }
}
 

IViewEngine:

publicinterfaceIViewEngine
{
// MethodsViewEngineResultFindPartialView(ControllerContextcontrollerContext, stringpartialViewName, booluseCache);
ViewEngineResultFindView(ControllerContextcontrollerContext, stringviewName, stringmasterName, booluseCache);
voidReleaseView(ControllerContextcontrollerContext, IViewview);
}


IView:

publicinterfaceIView
{
// MethodsvoidRender(ViewContextviewContext, TextWriterwriter);
}
自定义视图实现过程:
1.创建视图引擎,实现IViewEngine接口,实现FindView()方法,返回ViewEngineResult对象
2.创建视图
 
例:FindView()方法中:
return new ViewEngineResult(new WebFormView(controllerContext, viewPath, null), this);
return new ViewEngineResult(new RazorView(controllerContext, viewPath, null), this);
 
改变views目录后,需在相应的目录下添加web.config文件
注意:
需要将自定义视图引擎添加到 ViewEngines.Engines 视图引擎集合中
 
Application_start()中:
ViewEngines.Engines.Add(new DebugDataViewEngine()); 
 
在一个应用可以注册多个视图引擎,action调用器依次调用这些视图引擎的FindView方法,一旦某一个搜索引擎返回包含IView对象的ViewEngineResult结果调用停止,所以视图引擎注册的先后顺序是有影响的,可能存在两个视图引擎都可以处理同一个视图名称。如果我们想自定义的视图引擎优先处理可以将其插入列表首位:
 

ViewEngines.Engines.Insert(0, new DebugDataViewEngine());

 
 
 
 
 

ASP.NET MVC创建视图过程的更多相关文章

  1. ASP.NET MVC 5 - 视图

    在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...

  2. asp.net mvc 部分视图加载区别

    ASP.NET MVC 部分视图   ASP.NET(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 ...

  3. [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》

    [ASP.NET MVC2 系列]      [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序>       ...

  4. [转]ASP.NET MVC 5 - 视图

    在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...

  5. ASP.NET MVC创建的网站

    ASP.NET MVC创建的网站   最近在写一个网站,昨天刚写完,由于要和朋友一起测试,但是他电脑上没有环境,所以希望我在自己电脑上部署一下,让他直接通过浏览器来访问来测试,所以从昨晚到今天上午,通 ...

  6. Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html

    Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...

  7. ASP.NET MVC 创建控制器类过程

    MvcHandler.ProcessRequestInit()方法: 1.1获取控制器的名称string requiredString = this.RequestContext.RouteData. ...

  8. ASP.NET MVC 4 视图页去哪里儿

    这里特别感谢 swagon 提到了Displaymodeprovider,所以才有了本篇博客,也使我对[View的呈现]中寻找视图页的过程有了清晰的认识! 前戏 在MVC中,执行完Action之后,会 ...

  9. ASP.NET MVC Razor视图引擎攻略

    --引子 看下面一段MVC 2.0的代码. <%if (Model != null){%> <p><%=Model%></p><%}%>&l ...

随机推荐

  1. 2017qq红包雨最强攻略,

    这个只支持苹果手机,而且要有苹果电脑,只有苹果手机是不行的. QQ红包规则:只要你到达指定的位置,就可以领取附近的红包,一般也就几毛,还有几分的,当然也不排除有更高的,只不过我是没遇到... 那么既然 ...

  2. KB奇遇记(9):艰难的上线

    经历了非常多的磨难,系统也“如约“在2017年01月01日勉强上线了.尽管我认为它还不到上线的程度,条件不具备,但上头的指令下来和计划便是在这一天.整个上线过程从2016年3月8号开始到上线日,扣除中 ...

  3. hashcode的一些了解

    1.hashcode的作用? hashcode代表对象的特征,在集合类中广泛的使用. 2.hashcode是如何生成的? 在普通的对象中,获得对象的内存的地址,经过一些算法,不同对象生成不同的hash ...

  4. java多线程四种实现模板

    假设一个项目拥有三块独立代码块,需要执行,什么时候用多线程? 这些代码块某些时候需要同时运行,彼此独立,那么需要用到多线程操作更快... 这里把模板放在这里,需要用的时候寻找合适的来选用. 总体分为两 ...

  5. WebSockets介绍

    Web sockets定义为在servers和clients之间的双向连接.意味着servers和clients可以同时交流并发送数据.这种协议是从底层就是双工连接.Web sockets技术上得到了 ...

  6. 新注册第一帖----------------------乱码新手自学.net 之Linq 入门篇

    作为一个业余开发,断断续续学.net/c#也有不少日子了, 学习过程中,不断忘了学,学了忘,这让我很苦恼. 以前学习过程中,我总是在笔记本中记录下来知识要点,这么久下来,笔记本都写了四五本了. 然而, ...

  7. gridcontrol显示行号,总行,打印,导出Excel,设置标头及内容居中方法

    1.一般为了表格显示数据更直观,经常会显示行号以及总数.让gridcontrol显示行号,首先你需要设置一下显示行号的宽度,也就是IndicatorWith.默认值为-1,可根据实际数值需要设置宽度, ...

  8. gridView 编辑单元格获取单元格焦点位置(位于单元格的焦点位置)

    1.主要代码: private void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Col ...

  9. 精通gulp常用插件

    本文主要展示的是gulp常用插件的使用方法和用途,通过对插件的熟练运用达到精通gulp.不定期更新.可以到github上面下载DEMO. github地址:lin-xin/gulp-plugins 匹 ...

  10. keepalived 安装配置

    keepalived介绍 1. keepalived 是lvs 的扩展项目,因此它们之间具备良好的兼容性. 2. 通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离. 3. 负载均衡器之间的 ...