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>
轉載請注明:部落格園