熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

自己動手實現Asp.net的MVC框架

2013-11-13 09:48:15  來源: .NET編程 

  了解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()時找不到處理好的數據


From:http://tw.wingwit.com/Article/program/net/201311/11626.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.