本文介紹了自己編寫一個MVC的框架的方法。從JAVA STRUTS的實現和原理,逐步實現JAVA類,control類,mvc的c模型 (實現HTTP接口),control類跟據頁面FORM上的ACTION標記。
了解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#"%﹥
代碼如下:
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()時找不到處理好的數據。
您正在閱讀的是:自己動手實現Asp.net的MVC框架
【編輯推薦】
- ASP.NET MVC應用程序的本地化、單元測試和AJAX應用
- 簡單理解ASP.NET MVC基本知識
- 淺析ASP.NET MVC中的TempData機制
- 技術高手講評ASP.NET MVC 1.0
- ASP.Net MVC框架配置與分析