MvcHandler.ProcessRequest()
(1)获取Action执行结果:context2.Result
ActionExecutedContext context2 = this.InvokeActionMethodWithFilters(controllerContext, filters.ActionFilters, actionDescriptor, parameterValues
|
(2)InvokeActionResultWithFilters()方法中:
(3)ViewResultBase.ExecuteResult()方法中:
(4)ViewResult.FindView()方法中:
ViewResultBase属性 ViewEngineCollection
(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类型的两个属性)
IViewEngine:
自定义视图实现过程:
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创建视图过程
原文:http://www.cnblogs.com/liubiao/p/5230224.html