mvc基础系列说谈(2)——model

简介: Model(模型),在MVC中,它是包含了用于传递给视图要呈现的数据。第一种方式是传递弱类型,第二种是强类型。   (一)弱类型传递 ViewData与TempData 其中ViewData只能在一个视图中使用,就是在哪个动作中定义,就在相应的视图中作用。

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

 

(三)数据传递

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

 

public  TempDataDictionary TempData {  get set ; }
public  ViewDataDictionary ViewData {  get set ; }

 

然后执行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

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
3月前
|
前端开发 JavaScript
MVC中简单数据模型(M): Model类
MVC中简单数据模型(M): Model类
|
4月前
|
存储 前端开发 算法
MVC(Model-View-Controller)架构
MVC架构帮助开发者构建清晰、可维护和可扩展的Web应用程序。
40 2
|
前端开发
MVC模型
MVC模型
50 0
|
设计模式 前端开发 安全
Spring MVC-01循序渐进之Model 2和MVC
Spring MVC-01循序渐进之Model 2和MVC
63 0
|
前端开发 数据库 计算机视觉
关于MVC中模型model的验证问题
关于MVC中模型model的验证问题
144 0
关于MVC中模型model的验证问题
|
前端开发 JavaScript Apache
用backbone实现的一个MVC的小demo
本实例需要使用php支持。要现在Apache中配置虚拟目录,在Apache下的httpd-vhosts.conf文件中添加如下代码
用backbone实现的一个MVC的小demo
|
前端开发 数据库
|
存储 前端开发 C#