asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

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


发布日期:2019年07月08日
 
自己动手实现Asp.net的MVC框架

了解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

用MVC的话就不用ASPNET的服务器控件我们新建一个视图loginaspx把﹤%%﹥里面的东西都去掉只留﹤%@ Page Language=C#%﹥

代码如下

﹤%@ Page Language=C#%﹥﹤!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd﹥﹤html xmlns= ﹥﹤head runat=server﹥﹤title﹥Login﹤/title﹥﹤/head﹥﹤body﹥﹤form id=form action=Logindo method=post﹥﹤input id=Text type=text name=name /﹥﹤br /﹥﹤input id=Text type=text name=pwd /﹥﹤input id=Submit type=submit value=submit /﹥﹤/form﹥﹤/body﹥﹤/html﹥

在WEBCONFIG里面定义一个新的映射如下即所类似XXXdo的请求都会被映射到Controlcs这个类上这里我们可是以把所有的请求转到Control类上作进一步转发

﹤systemweb﹥﹤httpHandlers﹥﹤add verb=* path=*do type=Control/﹥﹤/httpHandlers﹥

实现Controlcs这个类新建一个Control类让他继承 IHttpHandler接口这个接口里面有两一个属性和一个方法

bool IsReusable { get; }//如果 SystemWebIHttpHandler 实例可再次使用则为 true否则为 false

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

Controlcs代码如下

using System;using SystemData;using SystemConfiguration;using SystemWeb;using SystemWebSecurity;using SystemWebUI;using SystemWebUIWebControls;using SystemWebUIWebControlsWebParts;using SystemWebUIHtmlControls;using SystemReflection;/// ﹤summary﹥/// HTTP 的摘要说明/// ﹤/summary﹥public class Control: IHttpHandler{public Control(){}public bool IsReusable{get{return true;}}public void ProcessRequest(HttpContext context){HttpRequest req = contextRequest;string path= reqCurrentExecutionFilePath;int index = pathLastIndexOf(/);string path = pathSubstring(index + );string actionName = actiondoSubstring( actiondoLength );//这里就能得到页面form信息里面的字符Login//以上几行代码主要是得到action的名字//利用反射调用action比如请求页面现在Type type = TypeGetType(actionName);Object kk = ActivatorCreateInstance(type); typeGetMethod(Execue)Invoke(kk new object[] { context });//Execue是Logincs里面的一个方法用于接收请求处理数据}

现在我们要建一个处理具本业务的action类即Logincs

代码如下

using System;using SystemData;using SystemConfiguration;using SystemWeb;using SystemWebSecurity;using SystemWebUI;using SystemWebUIWebControls;using SystemWebUIWebControlsWebParts;using SystemWebUIHtmlControls;using SystemCollections;public class Login{public Login(){}public void Execue(HttpContext contex){//处理具体的业务罗辑和数据操作并重定向到指定页面 //一般是处理出来的数据保存到模型里面方便视图调用数据显示 contexResponseRedirect(OKaspx);}}

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

using System;using SystemData;using SystemConfiguration;using SystemWeb;using SystemWebSecurity;using SystemWebUI;using SystemWebUIWebControls;using SystemWebUIWebControlsWebParts;using SystemWebUIHtmlControls;using SystemCollections;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 { }}}}

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

﹤table﹥ ﹤/table﹥

为了方便OKaspx调用数据在Logincs里面声明person模型时可以用静态声明的方式以防在okaspx页面上 new person()时找不到处理好的数据

               

上一篇:ASP.NET MVC雕虫小技 1-2

下一篇:ASP.NET 用JAMIL组件发布电子邮件