\" %>人物介绍
<%=Html.Span(\"span1\",\"姓名:\")%><%=Model.UserName %>
<%=Html.Span(\"span1\",\"年龄:\")%><%=Model.Age %>
<%=Html.Span(\"span1\",\"公司:\")%><%=Model.Company %>
(三)数据传递
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();
来返回一个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 { 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方法:
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的Model属性要赋值为这个模型。而ViewData的类型是:ViewDataDictionary,而它有一个Model属性:
public object Model { get {
return this._model; } set {
this.SetModel(value); } }
当返回ViewReslut(ActionResult)时,不为空的模型和ViewData一起放到ViewResult中返回。
而在ViewPage中的Model属性要由ViewData来获得:
public object Model { get {
return this.ViewData.Model; } }
在ViewPage类里可以看到:
Inherits=\"System.Web.Mvc.ViewPage\" 再看:
public class ViewPage : ViewPage where TModel: class