zoukankan      html  css  js  c++  java
  • mvc基础系列说谈(2)——model

    Model(模型),在MVC中,它是包含了用于传递给视图要呈现的数据。第一种方式是传递弱类型,第二种是强类型。

     

    (一)弱类型传递

    ViewDataTempData

    其中ViewData只能在一个视图中使用,就是在哪个动作中定义,就在相应的视图中作用。TempData在别的视图中也可以使用。

    public ActionResult ModelTest()
    {
        ViewData[
    "test"= "viewdata";
        TempData[
    "test"= "tempdata";
        
    return View();
    }

    <%=ViewData["test"%><br />
    <%=TempData["test"%>

    (二)强类型使用

    public class Person
    {
       
    public string UserName { getset; }
       
    public int Age { getset; }
       
    public string Company { getset; }
    }
    public ActionResult ShowPerson()
    {
        Person person 
    = new Person {UserName="宋江",Age=30, Company="好汉公司" };
        
    return View(person);
    }
    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits
    ="System.Web.Mvc.ViewPage<Web.Models.Entities.Person>" %> 

    <h2>人物介绍</h2>
    <%=Html.Span("span1","姓名:")%><%=Model.UserName %><br />
    <%=Html.Span("span1","年龄:")%><%=Model.Age %><br />
    <%=Html.Span("span1","公司:")%><%=Model.Company %><br />

    (三)数据传递

    public ActionResult ModelTest()
    {
        ViewData[
    "test"= "viewdata";
        ViewData[
    "testt"= "viewdatat";
        TempData[
    "test"= "tempdata";
        
    return View();

    }

    ViewData["test"] = "viewdata" 时,会对Controller的属性ViewData赋值:

    public ViewDataDictionary ViewData
    {
        
    get
        {
            
    if (this._viewDataDictionary == null)
            {
                
    this._viewDataDictionary = new ViewDataDictionary();
            }

            
    return this._viewDataDictionary;
        }
        
    set
        {
            
    this._viewDataDictionary = value;
        }
    }

    TempData也是向Controller的属性TempData赋值。

    然后通过return View();

    来返回一个ViewResultViewResultViewResultBase派生,而ViewResultBase又从ActionResult派生)。

    public abstract class ActionResult
    {
        
    // Methods
        protected ActionResult();
        
    public abstract void ExecuteResult(ControllerContext context);
    }

     

    View()方法会把ControllerViewDataTempData属性传递给ViewResult

    看方法:

    protected internal ViewResult View()
    {
        
    return this.View(nullnullnull);
    }

    protected internal virtual ViewResult View(string viewName, string masterName, object model)
    {
        
    if (model != null)
        {
            
    base.ViewData.Model = model;
        }

        ViewResult result 
    = new ViewResult();
        result.ViewName 
    = viewName;
        result.MasterName 
    = masterName;
        result.ViewData 
    = base.ViewData;
        result.TempData 
    = base
    .TempData;
        
    return result;
    }

     

    看一下ViewResult的两个属性:ViewDataTempData 

    public TempDataDictionary TempData { getset; }
    public ViewDataDictionary ViewData { getset; }

     

    然后执行ActionResultExecuteResult(ControllerContext context)方法

    ExecuteResult方法如下: 

    public override void ExecuteResult(ControllerContext context)
    {
        
    if (context == null)
        {
            
    throw new ArgumentNullException("context");
        }

        
    if (string.IsNullOrEmpty(this.ViewName))
        {
            
    this.ViewName = context.RouteData.GetRequiredString("action");
        }

        ViewEngineResult result 
    = null;
        
    if (this.View == null)
        {
            result 
    = this.FindView(context);
            
    this.View = result.View;
        }

        ViewContext viewContext 
    = new ViewContext(context, this.View, this.ViewData, his.TempData);
        
    this.View.Render(viewContext, context.HttpContext.Response.Output);
        
        
    if (result != null)
        {
            result.ViewEngine.ReleaseView(context, 
    this.View);
        }
    }

    可以看到,通过这个方法把控制器上下文对象,ViewData,TempData等对象生成ViewContext(视图上下文)。 

    接下来,视图上下文就会传递给ViewPage。所以TempDataViewData到了ViewPage 

    看看ViewPage类:

    public ViewContext ViewContext { [CompilerGenerated] get; [CompilerGenerated] set; }

    然后看看它的两个属性TempDataViewData

    public TempDataDictionary TempData
    {
        
    get
        {
            
    return this.ViewContext.TempData;
        }


    public ViewDataDictionary ViewData
    {
        
    get
        {
            
    if (this._viewData == null)
            {
                
    this.SetViewData(new ViewDataDictionary());
            }

            
    return this._viewData;
        }
        
    set
        {
            
    this.SetViewData(value);
        }
    }

    这里可以看出:TempData是通过ViewPageViewContext(视图上下文)来取得的(由ViewResultExecuteResult方法)。而ViewData则不是由ViewContext来获得。(未完)

    (四)Model的获取

    Model从哪里来的?

    ControllerView方法:

    protected internal virtual ViewResult View(string viewName, string masterName, object model)
    {
        
    if (model != null)
        {
            
    base.ViewData.Model = model;
        }

        ViewResult result 
    = new ViewResult();

        result.ViewName 
    = viewName;
        result.MasterName 
    = masterName;
        result.ViewData 
    = base.ViewData;
        result.TempData 
    = base.TempData;
        
    return result;
    }

    在动作中返回ViewResult时,如果模型不为无,那么,ViewDataModel属性要赋值为这个模型。而ViewData的类型是:ViewDataDictionary,而它有一个Model属性:

    public object Model
    {
        
    get
        {
            
    return this._model;
        }
        
    set
        {
            
    this.SetModel(value);
        }
    }

    当返回ViewReslutActionResult)时,不为空的模型和ViewData一起放到ViewResult中返回。

    而在ViewPage中的Model属性要由ViewData来获得:

    public object Model
    {
        
    get
        {
            
    return this.ViewData.Model;
        }
    }

    ViewPage类里可以看到:

    Inherits="System.Web.Mvc.ViewPage"

    再看:

    public class ViewPage<TModel> : ViewPage where TModel: class
  • 相关阅读:
    RecyclerView 数据刷新的几种方式 局部刷新 notify MD
    【图片】批量获取几万张图片
    RV BaseRecyclerViewAdapterHelper 总结 MD
    RecyclerView.ItemDecoration 间隔线
    Kotlin【简介】Android开发 配置 扩展
    Kotlin 特性 语法糖 优势 扩展 高阶 MD
    一个十分简洁实用的MD风格的UI主框架
    折叠伸缩工具栏 CollapsingToolbarLayout
    FloatingActionButton FAB 悬浮按钮
    Glide Picasso Fresco UIL 图片框架 缓存 MD
  • 原文地址:https://www.cnblogs.com/jams742003/p/1662564.html
Copyright © 2011-2022 走看看