Model(模型),在MVC中,它是包含了用于传递给视图要呈现的数据。第一种方式是传递弱类型,第二种是强类型。
(一)弱类型传递
ViewData与TempData
其中ViewData只能在一个视图中使用,就是在哪个动作中定义,就在相应的视图中作用。TempData在别的视图中也可以使用。
{
ViewData["test"] = "viewdata";
TempData["test"] = "tempdata";
return View();
}
<%=TempData["test"] %>
(二)强类型使用
{
public string UserName { get; set; }
public int Age { get; set; }
public string Company { get; set; }
}
{
Person person = new Person {UserName="宋江",Age=30, Company="好汉公司" };
return View(person);
}
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["test"] = "viewdata";
ViewData["testt"] = "viewdatat";
TempData["test"] = "tempdata";
return View();
}
当ViewData["test"] = "viewdata" 时,会对Controller的属性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派生)。
{
// Methods
protected ActionResult();
public abstract void ExecuteResult(ControllerContext context);
}
而View()方法会把Controller的ViewData和TempData属性传递给ViewResult。
看方法:
{
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 ViewDataDictionary ViewData { get; set; }
然后执行ActionResult的ExecuteResult(ControllerContext context)方法
ExecuteResult方法如下:
{
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类:
然后看看它的两个属性TempData和ViewData
{
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是通过ViewPage的ViewContext(视图上下文)来取得的(由ViewResult的ExecuteResult方法)。而ViewData则不是由ViewContext来获得。(未完)
(四)Model的获取
Model从哪里来的?
Controller的View方法:
{
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的Model属性要赋值为这个模型。而ViewData的类型是:ViewDataDictionary,而它有一个Model属性:
{
get
{
return this._model;
}
set
{
this.SetModel(value);
}
}
当返回ViewReslut(ActionResult)时,不为空的模型和ViewData一起放到ViewResult中返回。
而在ViewPage中的Model属性要由ViewData来获得:
{
get
{
return this.ViewData.Model;
}
}
在ViewPage类里可以看到:
Inherits="System.Web.Mvc.ViewPage"
再看: