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"
再看: