天天看點

mvc基礎系列說談(2)——model

Model(模型),在MVC中,它是包含了用于傳遞給視圖要呈現的資料。第一種方式是傳遞弱類型,第二種是強類型。

(一)弱類型傳遞

ViewData與TempData

其中ViewData隻能在一個視圖中使用,就是在哪個動作中定義,就在相應的視圖中作用。TempData在别的視圖中也可以使用。

public ActionResult ModelTest()

{

    ViewData["test"] = "viewdata";

    TempData["test"] = "tempdata";

    return View();

}

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

<%=TempData["test"] %>

(二)強類型使用

public class Person

   public string UserName { get; set; }

   public int Age { get; set; }

   public string Company { get; set; }

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 />

(三)資料傳遞

    ViewData["testt"] = "viewdatat";

當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();

來傳回一個ViewResult(ViewResult從ViewResultBase派生,而ViewResultBase又從ActionResult派生)。

public abstract class ActionResult

    // Methods

    protected ActionResult();

    public abstract void ExecuteResult(ControllerContext context);

而View()方法會把Controller的ViewData和TempData屬性傳遞給ViewResult。

看方法:

protected internal ViewResult View()

    return this.View(null, null, null);

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的兩個屬性:ViewData,TempData

public TempDataDictionary TempData { get; set; }

public ViewDataDictionary ViewData { get; set; }

然後執行ActionResult的ExecuteResult(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。是以TempData與ViewData到了ViewPage。

看看ViewPage類:

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

然後看看它的兩個屬性TempData和ViewData

public TempDataDictionary TempData

        return this.ViewContext.TempData;

        if (this._viewData == null)

            this.SetViewData(new ViewDataDictionary());

        return this._viewData;

        this.SetViewData(value);

這裡可以看出:TempData是通過ViewPage的ViewContext(視圖上下文)來取得的(由ViewResult的ExecuteResult方法)。而ViewData則不是由ViewContext來獲得。(未完)

(四)Model的擷取

Model從哪裡來的?

Controller的View方法:

在動作中傳回ViewResult時,如果模型不為無,那麼,ViewData的Model屬性要指派為這個模型。而ViewData的類型是:ViewDataDictionary,而它有一個Model屬性:

public object Model

        return this._model;

        this.SetModel(value);

當傳回ViewReslut(ActionResult)時,不為空的模型和ViewData一起放到ViewResult中傳回。

而在ViewPage中的Model屬性要由ViewData來獲得:

        return this.ViewData.Model;

在ViewPage類裡可以看到:

Inherits="System.Web.Mvc.ViewPage"

再看:

public class ViewPage<TModel> : ViewPage where TModel: class

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園

繼續閱讀