视图 page.cshtml在编译的时候也会编译成一个类,然而这个类会继承于WebViewPage<object>
然而这个类的父类就是WebViewPage<object>,然而WebViewPage<TModel>的父类WebViewPage
WebViewPage类也有ViewData、ViewBag、TempData、Model这四个属性,但是如何从控制器类的这个四个属性传递到View类的这四个同名属性的呢?
下面我们剖析一下:
数据传递给视图类对象" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="01控制器类会将数据传递给视图类对象" src="/Upload/Images/2015040615/736B8CB8262D3335.png" width="1347" height="690" />
在控制器的方法里返回一个View方法,View方法返回ViewResult,ViewResult类又继承自ViewResultBase类,我们在ViewResultBase类里有一个ExecuteResult方法,我们从下图可以看到,参数是控制器上下文对象,因为View方法有多个重载,假如你直接return View();没有加任何参数的话,那么系统会自动判断this.ViewName是否为空,如果为空的话,那么将去RouteData里面拿到Action的名字即视图的名字。
ViewContext viewContext=new ViewContext(context,this.View,this.ViewData,this.TempData,output);
如上方法,将控制器上下文,ViewData,TempData传到ViewContext即视图上下文里。
接着调用this.View.Render(viewContext,output); 将视图上下文当参数渲染视图,然而this.View是一个IView接口,所以我们要去查一下谁实现了Iview接口,如下图RazorView和WebFormView视图引擎,找到RenderView方法,在这里面将Controller里的ViewData数据赋值给View视图的ViewData、TempData数据