1. 程式人生 > >Asp.Net中實現自己的Mvc開發框架

Asp.Net中實現自己的Mvc開發框架

如今mvc框架越來越流行,像現在微軟推出的asp.net mvc都已經到了2.0版本了,而在java界的struts也早已成了j2ee開發的首選。工作之後,看到公司也有自己的一套mvc框架,所以閒暇之餘就想自己來實現一個mvc框架。

我個人覺得這個mvc框架實現並不難,關鍵在於設計思路以及對於mvc本身的理解。廢話不多說了,直接步入正題(對於mvc的基本知識在此不再多說)。

1.架構分析

1.1熟悉mvc請求過程:

對於web應用程式來說,只有一個事件就是請求,所有的互動都是通過“請求響應”的形式出現的。整個過程可以說就是得到請求、處理請求、顯示給使用者的過程,而之所以引入mvc就是為了將邏輯處理和頁面顯示分開。上圖顯示了一般mvc框架對於請求的處理過程,我們的框架也會沿用此過程,所以我們分析一下這個過程:一個請求到來之後首先會根據請求內容,將請求交給控制器,控制器根據請求具體內容做出相應的處理,而我們知道不管對怎樣的邏輯進行處理最終都會轉化為對資料的組織,因此這是就會呼叫相應的資料模組,最終將資料組織好最終交給檢視來顯示。

整個過程是很好理解,那麼我們用程式實現呢?我想此時就會出現幾個問題:如何交給controller?controller如何知道什麼樣的請求做出什麼用的處理?Controller知道處理什麼請求之後如何具體實施?如何將處理組織好的資料交給view?帶著幾個問題繼續往下看。

1.2引入HttpHandler

我們知道如果在應用中加入HttpHandler程式,並且在web.config中做出相應的配置的話其HttpHandler程式就會執行。那麼我們不妨利用HttpHandler程式根據請求的url來執行相應的controller程式(確切地說是controller中的一個動作action)。

1.3引入Asp.Net Mvc的url機制

我們可以得到url,那麼如何根據url處理相應action動作?解決辦法現在大致分為兩種:一種就是像struts一樣,使用配置檔案,根據一個特定字尾得到對應的名稱,然後在配置檔案中找到此名稱對應的程式;另一種就是像asp.net mvc一樣做出相應的約定,根據url格式進行相應的提取,找到對應的程式。而我個人認為後者更有利於開發,因此我們採用後者。

1.4引入反射

即使知道要呼叫哪個action,那麼如何去呼叫呢?這個問題其實就要引入.Net的反射機制,我們將通過反射動態建立Controller的例項並且根據的得到的資訊呼叫相應的action。

1.5引入NVelocity

如果像上面所說的,可以根據請求的不同執行相應的controller程式,那麼關鍵就變成了如果將處理好的資料顯示到相應的View中。這個問題我們可以藉助於NVelocity這個模板引擎來解決。我們知道NVelocity可以將後臺的資料以變數的形式存放到Velocity上下文中,在前臺的模板中只需要讀取相應的變數即可的到相應的資料。所以我們只要在cotroller的action中載入檢視模板,存放組織好的資料,再在對應的檢視模板中讀取這些資料就可了。

上的四個個"引入"已經解決了我們提出的所有問題,其實也就是我們框架的大致思路,因此接下來就是具體實現了。

2.程式設計

2.1框架主程式

首先我們的給url以約定,我們上面已經說了,我們採用contro/action/parameter(parameter可以沒有)的形式,例如http://127.0.0.1/Home/Index/1,這樣這樣的請求我們就可以得到Controller名字是Home,而Action名字是Index,引數是1。然後就是執行相應的Controller中的action程式。如何執行呢?我們知道其實Controller是一個類,而action是類中的一個方法。現在我們知道名字如何來執行程式呢?上面已經說了,利用反射我們載入程式集呼叫其方法。這裡由於我們不知道程式集處於何處,但是我們可以得到當前專案所用的所有程式集,然後根據約定(將所有的controller都放在專案根目錄的controllers資料夾下)就可以知道所有的controller類的全名(包含完整名稱空間)都會出現controllers,根據這個條件過濾出所有的controller類,再根據action名利用反射執行相應的方法。具體程式:

2.2Controller程式

為了更好的設計,這裡我們採用asp.net mvc的方式,使所有的controller類都繼承於我們controller基類,對於整個action向view傳值的過程我們也封裝成controller類的一個方法。除此之外controller基類還包含諸如response、request、server、session這樣的物件,以及它能夠像asp.net mvc一樣在action之間跳轉…具體我們看看程式碼:

2.3主要的類圖:

上面是主要程式程式碼(注意不是主要的程式碼,可以說是主幹),其他細緻的程式碼我就不再貼出來了,可以動動腦子,這裡主要類圖。

3.使用效果

3.1目錄結構

這是程式目錄結構,基本上和asp.net mvc是完全一樣的,注意我們是基於HttpHandler實現的,所以別忘了在web.config中註冊一下。

3.2程式程式碼

這裡是controller程式碼,實現了我們的基類controller,裡面有三個action,是一個簡單的登入操作(注意這裡簡單起見就不在再Modules中構建資料了)。

3.3執行效果

程式執行,首先我們是進入預設介面(注意在Global.asax中我們已經設定了程式預設的controller和action,這點很容易實現在urlHelper中實現,我們設定的預設controller是Home,action是Index)所以直接訪問進入我們的HomeController中的Index中

我們輸入使用者資訊,使用者密碼我輸入的是123,所以依照程式會到Default中(注意事實上是用Login這個action處理的,所以url中是顯示的是Home/Login)

如果輸入不正確呢,依照程式跳轉到Error這個View中

4.總結

程式主要思路就是根據請求提煉出controller和action,然後通過反射呼叫相應的action,而在action中我們將資料放入NVelocity的上下文中,在前臺檢視中讀取並組織資料。

Ok,很簡單吧,使用起來也還不錯O(∩_∩)O~,就到這裡吧,如果不是太明白,可以和我聯絡([email protected]),原始碼的話就先不放到這裡了吧,原理也不復雜,大家動動腦筋。

相關推薦

Asp.Net實現自己Mvc開發框架

如今mvc框架越來越流行,像現在微軟推出的asp.net mvc都已經到了2.0版本了,而在java界的struts也早已成了j2ee開發的首選。工作之後,看到公司也有自己的一套mvc框架,所以閒暇之餘就想自己來實現一個mvc框架。 我個人覺得這個mvc框架實現並不難,關鍵

利用快取過期在ASP.NET實現定時器

在B/S結構中要實現定時器(或者說是一個事務)實在不是一件好辦的事。可當你在網上搜索“ASP.NET定時器”的時候,你會發現搜尋結果是如此的多,可這大多數結果中的程式碼健壯性都是那樣的脆弱——沒有考慮諸如IIS程序的自然消亡、IIS程序的故障崩潰、重啟伺服器等等因素。這

Asp.net實現同一使用者名稱不能同時登入(單點登入)

最近找了一些單點登入的,發現了這篇文章,貌似還是可以實現的,先儲存了。 Web 專案中經常遇到的問題就是同一使用者名稱多次登陸的問題,相應的解決辦法也很多,總結起來不外乎這幾種解決辦法:將登陸後的使用者名稱放到資料庫表中;登陸後的使用者名稱放到Session中;登陸後

asp.net實現可拖動列的table

var drag = false; var warea = false; //onmouseover function MouseOver(obj) {   var validArea = obj.offsetWidth - event.offsetX;      if(validArea < 10)

ASP.NET實現多檔案上傳

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultiFileUpload.aspx.cs"   Inherits="MultiFileUpload"%><!DOCTYPE html PUBLIC "-//W3C//DTD 

ASP.NET實現POST傳送資料

HttpSendData.aspx <%@ Page language="c#"%><%@ Import Namespace = "System"%><%@ Import Namespace = "System.Collections"%>

一次asp.net core3.1打造webapi開發框架的實踐

實踐技術看點 1、Swagger管理API說明文件 2、JwtBearer token驗證 3、Swagger UI增加Authentication 4、EntityFrameworkCore+MySQL 5、在.net core 3.1下使用Log4net 前言 元旦過後就沒什

Asp.NetMVC緩存詳解

攔截 針對 http1 信息 我們 更新 ring file tin 本文通過介紹了Asp.Net中MVC緩存的種類,以及他們之間的區別等內容,讓學習者能夠深入的了解MVC緩存的原理機制,以下是具體內容: 緩存是一種保存資源副本並在下次請求時直接使用該副本的技術。當 web

ASP.NET的幾種彈出框提示基本實現方法

sys find xxxxx 文章 hello sage rtu msg CI 我們在.NET程序的開發過程中,常常需要和用戶進行信息交互,比如執行某項操作是否成功,“確定”還是“取消”,以及選擇“確定”或“取消”後是否需要跳轉到某個頁面等,下面是本人對常用對話框使用的小結

ASP.NETGridView實現行滑鼠滑過及選擇變色

https://blog.csdn.net/u010568463/article/details/44835833   一、滑鼠滑過變色 只要要給GridView新增OnRowDataBound方法即可。 前臺程式碼: <asp:GridView ID="GridView

Asp.Net MVC WebAPI的建立與前臺Jquery ajax後臺HttpClient呼叫詳解 Asp.Net對操作Sql Server 簡單處理的SqlDB類

1、什麼是WebApi,它有什麼用途?           Web API是一個比較寬泛的概念。這裡我們提到Web API特指ASP.NET MVC Web API。在新出的MVC中,增加了WebAPI,用於提供REST風格的WebService,新生成的W

ASP.NET簡單實現APP使用者個人頭像上傳和裁剪

  最近有個微信專案的使用者個人中心模組中,客戶要求使用者頭像不僅僅只是上傳圖片,還需要能對圖片進行裁剪。考慮到flash在IOS和Android上的相容性問題,於是想著能從js這塊入手,在網上發現了devotion博主寫的《適應各瀏覽器圖片裁剪無重新整理上傳js外掛》文章,從中受

ASP.NET使用UpdatePanel實現區域性非同步重新整理方法和攻略(轉)

asp.net UpdatePanel實現非同步區域性重新整理 鑑於最近專案需要,研究了一下UpdatePanel控制元件的使用方法,現總結如下,可能有很多地方不足,還望大家斧正哦,此文的目的也是為了幫助UpdatePanel的初學者,也是為了給自己的學習之路

asp.net hyperlink怎麼實現超連結

開啟VS2005工具欄 ,選擇hyperlink控制元件拖到你要放置連結的地方,在web設計視覺化頁面不要切換到HTML程式碼頁面,選擇你剛才拖進去的那個hyperlink控制元件,點選滑鼠右鍵檢視屬性,找到導航這一欄裡面有個 NavigateUrl屬性,點選空白處就可以瀏

ASP.NETJSONP的兩種實現以及其他跨域解決方案的簡單實現 ASP.NETJSONP的兩種實現以及其他跨域解決方案的簡單實現

ASP.NET中JSONP的兩種實現以及其他跨域解決方案的簡單實現    jQuery中JSONP的兩種實現方式:    都很簡單,所以直接上程式碼!    前臺程式碼如下: &l

如何實現asp.netFileUpload檔案型別過濾功能

<script type="text/javascript"> function openfile() { try { var fd = new ActiveXObje

ASP.NET怎樣實現圖片驗證碼功能,並且點選圖片會重新整理

------ 基本思路: 圖片的src=後臺的一個函式,此函式返回按照一定規則生成的圖片檔案流。 然後此圖片即可生成。 那麼怎樣重新整理驗證碼呢,這是個問題。 因為給圖片的src賦了值之後,想要更換一個圖片,那麼src的那個函式必須再執行一次才行。 <img src=

ASP.NET實時圖表的實現

在對大批量的資料進行分析比較時,最常用也是最直觀明瞭的表現方法莫過於繪製趨勢圖表。一般情況下,我們利用Excel製作各種型別的趨勢圖表,但它們都是基於靜態資料的,即資料是事先整理好的而不 是動態生成的。如果在網上釋出,只能將繪製好的圖表以靜態GIF影象釋出,這無法從根本上滿足

HTTP302與301的區別以及在ASP.NET如何實現

一.官方說法 301,302 都是HTTP狀態的編碼,都代表著某個URL發生了轉移,不同之處在於: 301 redirect: 301 代表永久性轉移(Permanently Moved)。 302 redirect: 302 代表暫時性轉移(Temporarily Mov

ASP.NET MVC 隨想錄—— 使用ASP.NET Identity實現基於宣告的授權,高階篇

在這篇文章中,我將繼續ASP.NET Identity 之旅,這也是ASP.NET Identity 三部曲的最後一篇。在本文中,將為大家介紹ASP.NET Identity 的高階功能,它支援宣告式並且還可以靈活的與ASP.NET MVC 授權結合使用,同時,它還支援使用第三方來實現身份驗證。 關於A