Model(模型),在MVC中,它是包含了用于传递给视图要呈现的数据。第一种方式是传递弱类型,第二种是强类型。

 

(一)弱类型传递

ViewDataTempData

其中ViewData只能在一个视图中使用,就是在哪个动作中定义,就在相应的视图中作用。TempData在别的视图中也可以使用。

public ActionResult ModelTest()
{
    ViewData[
"test"= "viewdata";
    TempData[
"test"= "tempdata";
    
return View();
}

 

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

 

(二)强类型使用

public class Person
{
   
public string UserName { getset; }
   
public int Age { getset; }
   
public string Company { getset; }
}

 

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

 

(三)数据传递

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

来返回一个ViewResultViewResultViewResultBase派生,而ViewResultBase又从ActionResult派生)。

public abstract class ActionResult
{
    
// Methods
    protected ActionResult();
    
public abstract void ExecuteResult(ControllerContext context);
}

 

View()方法会把ControllerViewDataTempData属性传递给ViewResult

看方法:

protected internal ViewResult View()
{
    
return this.View(nullnullnull);
}

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的两个属性:ViewDataTempData 

public TempDataDictionary TempData { getset; }
public ViewDataDictionary ViewData { getset; }

 

然后执行ActionResultExecuteResult(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。所以TempDataViewData到了ViewPage 

看看ViewPage类:

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

 

然后看看它的两个属性TempDataViewData

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是通过ViewPageViewContext(视图上下文)来取得的(由ViewResultExecuteResult方法)。而ViewData则不是由ViewContext来获得。(未完)

(四)Model的获取

Model从哪里来的?

ControllerView方法:

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时,如果模型不为无,那么,ViewDataModel属性要赋值为这个模型。而ViewData的类型是:ViewDataDictionary,而它有一个Model属性:

public object Model
{
    
get
    {
        
return this._model;
    }
    
set
    {
        
this.SetModel(value);
    }
}

 

当返回ViewReslutActionResult)时,不为空的模型和ViewData一起放到ViewResult中返回。

而在ViewPage中的Model属性要由ViewData来获得:

public object Model
{
    
get
    {
        
return this.ViewData.Model;
    }
}

 

ViewPage类里可以看到:

Inherits="System.Web.Mvc.ViewPage"

再看:

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

 

posted on 2010-02-03 12:43  梅桦  阅读(2661)  评论(1编辑  收藏  举报