学习ASP.NET MVC(三) Controller/Action 深入解析与应用实例
teData对象.
RequestContext类:
Routing组件在Web.Config中注册了一个HttpModule: System.Web.Routing.UrlRoutingModule, 而不 是HttpHandler:
可惜看不到这个类的源代码. 所有请求最后都是要传递给IHttpHandler对象处理, 主要的工作是编译 页面, 所以我猜测这个Module将请求截获后通过IRouteHandler接口对象获取一个HttpHandler, 然后将处 理移交给获取到的HttpHandler. ASP.NET MVC 中实现了IHttpHandler接口的类是MvcHandler, MvcRouteHandler.GetHttpHandler方法 就是返回一个MvcHandler对象. MvcHandler类的构造函数需要传入一个RequestContext对象. 实现的 IHttpHandler接口方法处理过程中都需要依赖这个对象. 但是微软在这里的处理有一些不足. MvcHandler虽然实现了IHttpHandler接口但是不能被当作 IHttpHandler接口使用. 因为IHttpHandler中没有定义RequestContext属性, 如果一个MvcHandler对象此 属性没有赋值则会出错, 也没有将默认的无参数构造函数设置为private, 所以理论上可以很随意的实例 化一个MvcHandler而不为其RequestContext属性赋值. IRouteHandler想实现的语意是: 返回一个具有RequestContext属性的IHttpHandler对象. 但是最后的实现结果是: 提供"返回IHttpHandler对象"的方法, 此方法接收 RequestContext对象参数. 还需要注意ControllerContext类. 在Controller的处理过程中使用此对象作为保存上下文数据的容器 .下面是这几个类的包含关系: 可以看到在ControllerContext中包含了RequestContext对象,但是又将RequestContext对象中的两个 属性提取到自己的类中.如果仅仅是为了使用方便而这么做, 个人认为不是一个好的设计.数据对象的存储 职责也应该明确,使用ControllerContext.RequestContext.RouteData 的方式更容易被人理解. PS:这种方式类似于方法内联.对于属性JIT为了效率会帮助我们做内联.而仅仅是为了使用方便. 2.IView 与 View对象的关系 所以从系统的角度上看, 实现了IView接口的对象才是View. 但是从实现效果上看, 具体的aspx或者ascx页面才是View. 当第一次看到IView接口时我认为它应该是"View角色"需要实现的接口. 但是结果并不是这 样. 在我们的系统中View对象应该是aspx或者ascx文件. 而且并不是所有的ActionResult都需要找到aspx 或者ascx文件, 事实上只有PartialViewResult 和 ViewResult 才会去寻找View对象.其他的 ActionResult要么是返回文件, 要么是跳转等等. 那么两者的关系到底是怎样的? 其实其中的过程需要牵扯到这几个接口和类: IViewEngine, ViewEngineResult, ViewEngineCollection ViewEngine是View引擎, ViewEngineCollection是一个引擎集合,里面保存了各种寻找View的引擎.但 是在目前的源代码中只有WebFormViewEngine : VirtualPathProviderViewEngine : IViewEngine 这一系列WebForm使用的引擎.引擎的作用有两个: 1.寻找Page/用户控件的路径 2.根据路径创建IView对象.也就是根据页面的物理文件创建IView接口对象. 而且目前实现了IView接口的对象也只有一个: WebFormView WebFormViewEngine 根据页面路径, 将一个页面地址转化为一个WebFormView对象,也就是一个IView接 口对象. 至此IView接口和Page页面类仍然没有任何关系, IView对象只是保存了页面 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |