发表于:2009-10-12 浏览:44 作者: 来源:站长资讯网
 关键字:MVC,山寨,HTTPMODULE,ASP,框架
 描述:在ASP.NetMVC框架中是使用地址拦截的,虽然很好用,但是装起来太大了,配置也麻烦。本文通过代码实践,在ASP.Net2.0框架下实现一套简易的MVC框架。MVC框架难于构建的地方在于Controller与View的分离以及分
在ASP.Net MVC框架中是使用地址拦截的,虽然很好用,但是装起来太大了,配置也麻烦。本文通过代码实践,在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 {
 /// <summary>
 /// 控制器
 /// </summary>
 [WebService(Namespace = "http://tempuri.org/")]
 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 public abstract class Controller<T, K> : IHttpHandler {
 /// <summary>
 /// 当前请求
 /// </summary>
 protected MyRequest Request;
 /// <summary>
 /// 输出
 /// </summary>
 protected HttpResponse Response;
 /// <summary>
 /// 返回到View页面的数据
 /// </summary>
 protected MvcViewData<T, K> ViewData;
 /// <summary>
 /// 控制器名称
 /// </summary>
 private string controllerName;
 /// <summary>
 /// 控制器操作方法
 /// </summary>
 public abstract void Action();
 /// <summary>
 /// 执行请求
 /// </summary>
 /// <param name="context"></param>
 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<T, K>();
 Action();
 context.Items.Add("MvcViewData", ViewData);
 context.Server.Transfer("~/View/" + ControllerName + ".aspx", false);
 }
 /// <summary>
 /// 控制名称,不设置默认为View页面与控制器名称同名
 /// 比如,在Login.ashx请求中,默认调用View/Login.aspx的页面作为显示页面。
 /// 当登录成功后,设置其为LoginOK,则会调用View/LoginOK.aspx
 /// </summary>
 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文件的写法
| 以下为引用的内容: Default sing DotNetMVC.MVC;
 
 namespace DotNetMVC {
 /// <summary>
 /// $codebehindclassname$ 的摘要说明
 /// </summary>
 public class Default : Controller<string, string> {
 public override void Action() {
 
 }
 }
 }
 | 
在Controller中,还有两个重要的东西一个是传递给View数据用的,一个是显示哪个View的(通过ControllerName这个属性)
原文地址:http://www.cnblogs.com/birdshover/archive/2009/09/20/1570552.html