星期五下班前一時興起,對MVC發表了一點看法。後來就想乾脆弄個小東西來驗證一些自己的想法幫組理清思路。所要原始碼的免了,3個小時的急就章實在是亂得可以,既沒有好的架構,也沒有任何代碼品質可言,主要是實現了對MVC的一點想法。所以拿出來大家給參考一下。申明:不是典型的MVC
在這裡我參考了Web.Py的一些做法,首先我們將Url當作一種資源,一個典型的Url,如下:
http://www.x.com/Index/view/2007/10/21
我們將從/Index/Topic/2007/10/21開始的的部分看作是有語義的,這裡將Index映射到Controller類Index,Topic則表示這一次調用的行為,也就是調用Index類的Topic方法。
後面的/2007/10/21則是參數。而這些參數作為View方法的參數被傳遞給Controller,也就是這裡Topic方法可以重載,如果找不到參數相對應的方法就直接調用沒有參數的Topic方法。
Index類被作為Controller,至於View,隨便了,可以直接用StringTemplate或者其他任何模板引擎,圖方便的話直接Redirect到ASPX頁面也行。
使用的方法:
首先Copy SpectraAction.DLL到bin目錄。然後在Web.Config裡添加:
<configSections>
<sectionGroup name="SpectraAction">
<section name="Common" type="System.Configuration.SingleTagSectionHandler"/>
<section name="Urls" type="System.Configuration.DictionarySectionHandler"/>
</sectionGroup>
</configSections>
<SpectraAction>
<Common Base="/TestSpectra" DefaultAction="Proccess" Assembly="" />
<Urls>
<add key="/index" value="Controller.Index"/>
</Urls>
</SpectraAction>
在Url裡面的項就是註冊Url到Controller的映射關係的。Common裡的Base定義了Url的基礎,因為在很多時候在根下有一些目錄比較特殊,為了不影響這些目錄,所以設定了這個參數用來設定一個基礎來避開。所以這裡要從 /TestSpectra之後的部分才開始具備語義。
然後就是實現Controller.Index這個類: 1namespace Controller
2{
3 public class Index:MasterController
4 {
5 public Index()
6 {
7 //
8 // TODO: 在此處添加建構函式邏輯
9 //
10 }
11 public void Proccess()
12 {
13 this.AppendText("Test");
14 }
15 public void Proccess(string A)
16 {
17 this.AppendText("Test"+A);
18 }
19 }
20}
最後我們在瀏覽器裡輸入 http://localhost/TestSpectra/Index
這個時候輸出 Test 因為設定了預設的行為,所以自動調用了Proccess方法。
如果輸入 :
http://localhost/TestSpectra/Index/Proccess/ActionA/
這個時候就會調用void Proccess(string A)這個方法,輸出了字串TestActionA
就是這個樣子咯,模型的話隨便什麼都行,視圖的話隨便用什麼模板引擎都行