• Mvc学习笔记(4)


    上文我介绍了如何将控制器里的值传递给视图,但是是如何传递的呢?原理是什么?

    视图 page.cshtml在编译的时候也会编译成一个类,然而这个类会继承于WebViewPage<object>

    03页面编译成页面类

    然而这个类的父类就是WebViewPage<object>,然而WebViewPage<TModel>的父类WebViewPage

    22

    WebViewPage类也有ViewData、ViewBag、TempData、Model这四个属性,但是如何从控制器类的这个四个属性传递到View类的这四个同名属性的呢?

    下面我们剖析一下:

    01控制器类会将数据传递给视图类对象

    在控制器的方法里返回一个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数据

    333

    666

    777

  • 相关阅读:
    P2617 Dynamic Rankings 动态主席树
    P4338 [ZJOI2018]历史 LCT+树形DP
    P3348 [ZJOI2016]大森林
    P3613 睡觉困难综合征 LCT+贪心+位运算
    SP16549 QTREE6
    P3703 [SDOI2017]树点涂色 LCT维护颜色+线段树维护dfs序+倍增LCA
    U19464 山村游历(Wander) LCT维护子树大小
    P4219 [BJOI2014]大融合 LCT维护子树大小
    P2542 [AHOI2005]航线规划 LCT维护双连通分量
    P3950 部落冲突
  • 原文地址:https://www.cnblogs.com/changfutao/p/4396003.html
Copyright © 2020-2023  润新知