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

ASP.NET
asp.net Execl的添加,更新操作实现代码
asp.net 生成曲线图实现代码
从外部的js文件中获取ASPX页面的控件ClientID
asp.net 因为数据库正在使用的解决方法
asp.net Repeater 自递增
asp.net 实现防迅雷等下载工具盗链
ASP.NET封装的SQL数据库访问类
asp.net 通过指定IP地址得到当前的网络上的主机的域名
aspx 服务器架设问题解决
ASP.NET Session使用详解
Asp.net 5种页面转向方法
ASP.NET 用户多次登录的解决方法
ASP.NET下母版页和内容页中的事件发生顺序整理
asp.net 程序性能优化的七个方面 (c#(或vb.net)程序改进)
从客户端检测到有潜在危险的Request.Form值的asp.net代码
asp.net CommunityServer中的wwwStatus
在应用程序级别之外使用注册为allowDefinition=''MachineToApplication''的节是错误的
.net开发人员常犯的错误分析小结
ASP.net Substitution 页面缓存而部分不缓存的实现方法
asp.net 生成静态时的过滤viewstate的实现方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 180 ::
收藏到网摘: 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