httpmodule:基于ASP.
NET2.0的非HttpModule山寨版MVC框架的实现
疯狂代码http://CrazyCoder.cn/?:http:/CrazyCoder.cn/BlogDigest/Article74820.html在ASP.NetMVC框架中是使用地址拦截的,虽然很好用,但是装起来太大了,配置也麻烦。本文通过代码实践,在ASP.Net2.0框架下实现一套简易的MVC框架。MVC框架难于构建的地方在于Controller与View的分离以及分离后数据可以方便地传输。为了保持代码的简洁,将使用ashx文件作为Controller,用aspx页面作为View。讲起来比较费劲,把项目文件放上来,而下面只作一个简单的说明。项目是VS2008的项目,大小15K。下载地址:DotNetMVC.
rar首先构建一个Controller基类。;Controller类/**;*;author;:;yurow;*;;;;;;http://birdshover.cnblogs.com;*;description:;*;;;;;;;*;history;:;created;by;yurow;2009-9-20;7:30:04;;*/using;System.Web;using;System.Web.Services;namespace;DotNetMVC.MVC;{;;;;///;
;;;;///;控制器;;;;///;;;;;[WebService(Namespace;=;"http://tempuri.org/")];;;;[WebServiceBinding(ConformsTo;=;WsiProfiles.BasicProfile1_1)];;;;public;abstract;class;Controller
;:;IHttpHandler;{;;;;;;;;///;;;;;;;;;///;当前请求;;;;;;;;///;;;;;;;;;protected;MyRequest;Request;;;;;;;;;///;;;;;;;;;///;输出;;;;;;;;///;;;;;;;;;protected;HttpResponse;Response;;;;;;;;;///;
;;;;;;;;///;返回到View页面的数据;;;;;;;;///;;;;;;;;;protected;MvcViewData;ViewData;;;;;;;;;///;;;;;;;;;///;控制器名称;;;;;;;;///;;;;;;;;;private;string;controllerName;;;;;;;;;///;;;;;;;;;///;控制器操作方法;;;;;;;;///;;;;;;;;;public;abstract;void;Action();;;;;;;;;///;;;;;;;;;///;执行请求;;;;;;;;///;;;;;;;;;///;;;;;;;;;public;void;ProcessRequest(HttpContext;context);{;;;;;;;;;;;;Request;=;context.Request;;;;;;;;;;;;;Response;=;context.Response;;;;;;;;;;;;;//这里可以用反射的方式进行带参数的操作,这里为了简化,去掉了这部分;;;;;;;;;;;;//MethodInfo;method;=;this.GetType().GetMethod("Action",;new;Type[0]);;;;;;;;;;;;;//if;(method;==;null);{;;;;;;;;;;;;//;;;;throw;new;NotImplementedException("没有实现!");;;;;;;;;;;;;//};;;;;;;;;;;;//object;data;=;method.Invoke(this,;null);as;object;;;;;;;;;;;;;ViewData;=;new;MvcViewData();;;;;;;;;;;;;Action();;;;;;;;;;;;;context.Items.Add("MvcViewData",;ViewData);;;;;;;;;;;;;context.Server.Transfer("~/View/";+;ControllerName;+;".aspx",;false);;;;;;;;;};;;;;;;;///;;;;;;;;;///;控制名称,不设置默认为View页面与控制器名称同名;;;;;;;;///;比如,在Login.ashx请求中,默认调用View/Login.aspx的页面作为显示页面。;;;;;;;;///;当登录成功后,设置其为LoginOK,则会调用View/LoginOK.aspx;;;;;;;;///;;;;;;;;;protected;string;ControllerName;{
;;;;;;;;;;;;get;{;;;;;;;;;;;;;;;;if;(string.IsNullOrEmpty(controllerName));;;;;;;;;;;;;;;;;;;;return;this.GetType().Name;;;;;;;;;;;;;;;;;return;controllerName;;;;;;;;;;;;;};;;;;;;;;;;;set;{;;;;;;;;;;;;;;;;controllerName;=;value;;;;;;;;;;;;;};;;;;;;;};;;;;;;;public;bool;IsReusable;{;;;;;;;;;;;;get;{;;;;;;;;;;;;;;;;return;false;;;;;;;;;;;;;};;;;;;;;};;;;}}Controller在ProcessRequest方法中调用aspx页面,里面设置了一个虚方法Action在具体的ashx文件中重载。下面是Default.ashx.cs文件的写法Defaultsing;DotNetMVC.MVC;namespace;DotNetMVC;{;;;;///;;;;;///;$codebehindclassname$;的摘要说明;;;;///;;;;;public;class;Default;:;Controller;{;;;;;;;;public;override;void;Action();{;;;;;;;;};;;;}}在Controller中,还有两个重要的东西一个是传递给View数据用的,一个是显示哪个View的(通过ControllerName这个属性)2009-9-252:00:39疯狂代码http://CrazyCoder.cn/