在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