当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 基于ASP.NET2.0的非HttpModule山寨版MVC框架的实现

ASP.NET
灵活正确的实现.NET插件机制
在Asp.net中为图像加入版权信息
重构Session确实让代码简洁干净了不少
JSP与ASP.Net之间的Session值共享
如何获取当前程序文件的路径 Current Path
在.NET框架应用程序中发送电子邮件
asp.net开发wap程序必备:识别来访手机品牌型号
ASP.NET 2.0中使用自定义provider
asp.net开发wap必备:更好的匹配手机设备
用ashx动态生成文件
ASP.NET中17种正则表达式
提高ASP.Net应用程序性能的十大方法
一个通过web.Mail发送邮件的类
在DataGrid里面根据日期的不同显示new图标
Asp.Net细节性问题精萃
自定义控件中使用枚举类型的属性(原创)
.NET开发 正则表达式中的 Bug
.Net学习:IronPython分析Lambda表达式
ASP.NET中的Response对象的方法
在ASP.NET 2.0中数据绑定的实现方法

基于ASP.NET2.0的非HttpModule山寨版MVC框架的实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 126 ::
收藏到网摘: n/a

在ASP.Net MVC框架中是使用地址拦截的,虽然很好用,但是装起来太大了,配置也麻烦。本文通过代码实践,在ASP.Net2.0框架下实现一套简易的MVC框架。MVC框架难于构建的地方在于Controller与View的分离以及分离后数据可以方便地传输。为了保持代码的简洁,将使用ashx文件作为Controller,用aspx页面作为View。

讲起来比较费劲,把项目文件放上来,而下面只作一个简单的说明。项目是VS2008的项目,大小15K。

下载地址:DotNetMVC.rar

首先构建一个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文件的写法

以下为引用的内容:


sing DotNetMVC.MVC;

namespace DotNetMVC {
    
/// <summary>
    
/// $codebehindclassname$ 的摘要说明
    
/// </summary>
    public class Default : Controller<stringstring> {
        
public override void Action() {

        }
    }
}

在Controller中,还有两个重要的东西一个是传递给View数据用的,一个是显示哪个View的(通过ControllerName这个属性)

原文地址:http://www.cnblogs.com/birdshover/archive/2009/09/20/1570552.html