MVC-viewer

    在Web Form中,我们不需要考虑action,我们只需考虑页面。一般我们会设置一个表单来收集用户的数据然后通过一个postback来提交这些数据。而在MVC中,我们使用view来呈献给用户我们希望的HTML页面。view是一个类,用于获取一个模板和数据然后给浏览器产生响应。controller选择下一个view并让他处理响应。controller没有从view中获取任何参数和数据,它的职责范围仅限与当他提交给view之后。因此,view负责写输出流内容给浏览器。方向如下:Controller--》Views--》Browser.有时候我们不会接收到HTML,而是javascript或者JSON字符串,这些是异步请求产生的数据。ActionResult并不是完全的数据容器,而是一个抽象类,提供统一的编程接口来执行任何操作,并为浏览器产生结果。Controller产生数据,保存在一个viewdata字典的属性中,供view使用。C和V使用这个ViewData来交换数据。

    view引擎仅仅是一个实现了IViewEngine接口的类:pubic interface IViewEngine{void ReaderView(ViewContext vc);},你也可以重写自己的view引擎类,更多信息看参考http://mvscontrib.codeplex.con/documentation或者http://sparkviewengine.con

    ViewResult打包任何可view可以使用的数据。view有多种重载方法,但是最主要的两种是virtual ViewResult View(IView view,object model)和virtual ViewResult View(sting viewname,string maserName,object model);

 

ControllerActionInvoker 表示一个类,该类负责调用控制器的操作方法。

    actioninvoker做两件事:执行控制器的方法并保存结果;处理动作结果

ViewResult类,基类:ViewResultBase类的属性:TempData,View,ViewData,ViewEngineCollection,ViewName、方法:ExecuteResult和抽象方法:FindView。viewresult通过添加MasterName属性来表明masterview的名字和重载FindView方法。

public override void executeresult(controllercontext con)

{

if(con==null)

 throw new ArgumentNullException(“context”);

if(strng.IsNullEmpty(this.ViewName))

this.ViewName=con.RouteData.GetRequiredString(“action”);

 

ViewEngineResult result=null;

if(this.VIew==null)

{result=this.FindView(context);

this.VIew=result.View;

}

ViewContext viewContext=new ViewCOntext(con,this.View,this.ViewData,thsi.TempData);

this.View.Reader(viewContext,con.HttpContext.Response.Output);

if(result!=null) result.ViewEngine.ReleaseView(con,this.View);

}

 

 

IViewEngine接口有三个方法:VIewEngineResult:FindPartialView,FindView;void:ReleaseView

public class VIewEngineResult{

public VIewEngineResult(IEnumerable《String》 search);

public VIewEngineResult(IVew view,IViewEngine viewengine);

 

public IEnumerable<string> SearchLocation{get;private set;}

public IViewEngine ViewEngine{get;private set;}

 

}

 

 

public interface IVew

{void Rebdre(ViewContext view,TextWriter writer);}

 

VirtualPathProvider类是基本ASP.NET框架的一个特殊部分。它允许你实现一种可从服务器访问的"虚拟URL"。这样你就可以动态产生对某个URL的响应而不需要在硬盘上保存ASPX或HTML文件。http://www.cnblogs.com/xujiaoxiang/archive/2010/05/24/1742917.html

 

  • IView是所有HTML视图的抽象
  • ActionResult是Controller对View的控制的抽象,也是View的入口。
  • ViewResult用于指明呈现某个HTML视图(IView实例)。
  • ViewResult是IView实例的使用者,查找、呈现和释放IView实例。
  • IViewEngine是IView的管理者,被ViewResult调用,用于查找和释放IView实例。
  •  

    GetPath方法干的事情:
     获取视图位置(GetViewLocations) 检查是否使用了区域(Area)
    如果使用了区域,则把areaLocations传入
    GetViewLocations方法会将locations和areaLocations这两个字符串数组包装和合并成一个ViewLocation的集合
    如果集合没有东西,那么抛异常

    缓存检索
    获取路径 如果名称像是一个绝对路径("/"或"~"开头) 检查虚拟路径所指向的文件是否存在(FileExists)
    存在则返回名称(当作路径)。
    否则返回空字符串。

    如果名称不像是一个绝对路径 遍历所有的视图位置生成虚拟路径
    如果虚拟路径所指向的文件存在,则返回这个虚拟路径。
    如果所有生成的虚拟路径所指向的文件都不存在,则返回空字符串。

     

    缓存处理部分我并不关心,现在从外部来看GetPath方法,那么它的参数分为三大部分:
     缓存部分 controllerContext(主要利用里面的HttpContext.Cache模块)
    cacheKeyPrefix
    useCache

    位置部分:
    locations和areaLocations,这是虚拟路径的模版,使用的值是VirtualPathProviderViewEngine的公开属性。 locationsPropertyName,这个用于抛异常的时候指示使用的哪个Property。

    名称部分: name,这个参数会是viewName或者masterName
    controllerName,这个参数标识了控制器的名称
    areaName,没有出现在参数中,但利用controllerContext提取了出来,事实上controllerName也是从controllerContext中提取的,性质一样。
     
    GetPath方法的参数真是一团糟。不应当传入ControllerContext而是传入areaName和Cache,locations、areaLocations和locationsPropertyName应该绑成一个对象。换言之,这样岂不更好:
     
    private string GetPath( Cache cache, string cacheKeyPrefix, bool useCache, LocationsInfo locations, string name, string controllerName, string areaName );
     
    最后用一句话来总结GetPath方法干的破事儿:(http://www.cnblogs.com/Ivony/archive/2010/11/15/aspnet-mvc-by-source-2.html)
     
    利用提供的虚拟路径模版和名称产生虚拟路径,并检查虚拟路径文件是否存在(FileExists),如果存在则返回虚拟路径。
     
     
     
    那么,默认虚拟路径模版到底有哪些呢?这些东西是在派生类(WebFormViewEngine)中定义的。

     

    Render方法获取BuildManaget对象来确保源代码文件能正确的编译成动态页面,BuildManager有个对页面对象的参考,render使用这个参考来响应

    文章来自学IT网:http://www.xueit.com/asp.net/show-8896-4.aspx

    参考资料:

    1:http://www.cnblogs.com/mike108mvp/archive/2008/07/16/1244306.html   ASP.NET MVC Tip #15 – 传递浏览器Cookies和服务器变量作为Action参数

    2:http://www.cnblogs.com/Ivony/archive/2010/11/15/aspnet-mvc-by-source-2.html 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值