• 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
  • 相关阅读:
    git的使用
    open():打开文件
    结合python+selenium使用AutoIt V3实现文件、图片上传
    Postman教程
    Python字符串切片
    python实现操作excel,数据写入excel的一行或者一列
    python打包exe
    spring boot基于DRUID数据源密码加密及数据源监控实现
    基于aop的日志记录方式实现
    Android中ContentProvider的简单使用
  • 原文地址:https://www.cnblogs.com/jams742003/p/1662564.html
Copyright © 2020-2023  润新知