当前位置: 首页 > 图文教程 > .Net技术 > ASP.NET > 自己动手实现Asp.net的MVC框架

ASP.NET
VS2008SP1下jQuery使用初体验
使用asp.net 2.0中的SqlBulkCopy类批量复制数据
asp.net定点执行任务总结
通过webBrowser 来轻松模拟网页来源
ASP.NET框架 数据回发与事件回发
浅谈ASP.NET内部机制
通用语言规范
GC垃圾回收
ASP.NET 配置
ASP.NET 安全认证
ASP.NET生成复合控件
asp.net中forms验证
DataTable中数据记录的统计
关于无aspx文件部署,我的一些探索心得
ASP.NET刷新页面的六种方法
ASP.NET MVC应用程序的本地化、单元测试
详解ASP.NET的四种状态
.NET与Java间进行Web Service交互的选择
自己动手实现Asp.net的MVC框架
ASP.net中网站访问量统计方法

ASP.NET 中的 自己动手实现Asp.net的MVC框架


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

了解JAVA的人都了解struts框架,是一个典型的mvc框架,早些时候微软也实现了.NET版的MVC,用到了路由技术,由于不开源,好多地方感到有些迷惑,于是有一个想法,为什么不自已写一个MVC的框架呢。

说到MVC,先说一下JAVA STRUTS的实现和原理,所有的HTTP请求都会连到一个JAVA类,control类,mvc的c模型(实现HTTP接口),control类跟据页面FORM上的ACTION标记,当然这里的ACTION的值是一个操作类的名字,我们叫它ACTION 类,然后跟据反射用类的名字调用这个类,当然反射调用时也把http请求的内容传进去。然后action类里面跟据请求里面的参数作一定的业务罗辑处理,处理完之后,把数据内容放在类里面,重定向一个页面。视图显示action里面的处理后的数据。

知道了MVC的原理,我们现在就用.NET来实现MVC。

1,用MVC的话就不用ASP.NET的服务器控件,我们新建一个视图login.aspx,把﹤%%﹥里面的东西都去掉只留﹤%@ Page Language="C#"%﹥

代码如下:

﹤%@ Page Language="C#"%﹥﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥﹤head runat="server"﹥﹤title﹥Login﹤/title﹥﹤/head﹥﹤body﹥﹤form id="form1" action="Login.do" method="post"﹥﹤input id="Text1" type="text" name="name" /﹥﹤br /﹥﹤input id="Text2" type="text" name="pwd" /﹥﹤input id="Submit1" type="submit" value="submit" /﹥﹤/form﹥﹤/body﹥﹤/html﹥


2,在WEB.CONFIG里面定义一个新的映射,如下,即所类似XXX.do的请求都会被映射到Control.cs这个类上。这里我们可是以把所有的请求转到Control类上作进一步转发。

﹤system.web﹥﹤httpHandlers﹥﹤add verb="*" path="*.do" type="Control"/﹥﹤/httpHandlers﹥


3,实现Control.cs这个类,新建一个Control类,让他继承 IHttpHandler接口,这个接口里面有两一个属性和一个方法,
bool IsReusable { get; }//如果 System.Web.IHttpHandler 实例可再次使用,则为 true;否则为 false。

void ProcessRequest(HttpContext context);// 启用 HTTP Web 请求的处理。可以接收到页面的请求内容,里面主要包括Request,Response,等,方便我们接收参数和页面转发。


Control.cs代码如下:

using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Reflection;/// ﹤summary﹥/// HTTP 的摘要说明/// ﹤/summary﹥public class Control: IHttpHandler{public Control(){}public bool IsReusable{get{return true;}}public void ProcessRequest(HttpContext context){HttpRequest req = context.Request;string path= req.CurrentExecutionFilePath;int index = path.LastIndexOf("/");string path1 = path.Substring(index + 1);string actionName = actiondo.Substring(0, actiondo.Length - 3);//这里就能得到页面form信息里面的字符Login//以上几行代码主要是得到action的名字。//利用反射调用action,比如请求页面现在Type type = Type.GetType(actionName);Object kk = Activator.CreateInstance(type); type.GetMethod("Execue").Invoke(kk, new object[] { context });//Execue是Login.cs里面的一个方法,用于接收请求,处理数据。} 


现在我们要建一个处理具本业务的action类即Login.cs ,

代码如下:

using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;public class Login{public Login(){}public void Execue(HttpContext contex){//处理具体的业务罗辑和数据操作。并重定向到指定页面 //一般是处理出来的数据保存到模型里面,方便视图调用数据显示。 contex.Response.Redirect("OK.aspx");}}


4,我们现在建一个数据模型Person,可以保存和返回数据集,即MVC里面的M,

using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;namespace Person{/// ﹤summary﹥/// Model 的摘要说明/// ﹤/summary﹥public class Person{public Person(){}privatestring _id;privatestring _name;publicstring Id{get { return _id; }set { _id = value; }}publicstring Name{get { return _name; }set { _name = value; }}publicDataTabledt{get { }set { }}}}


5,OK.aspx里面显示处理后的数据显示,可以用person里面的dt属性返回数据按asp显示数据的方法显示出

﹤table﹥......... ﹤/table﹥ 

为了方便OK.aspx调用数据,在Login.cs里面声明person模型时可以用静态声明的方式,以防在ok.aspx页面上 new person()时找不到处理好的数据。