谈谈.NET MVC QMVC高级开发
??? 自從吾修主頁上發布了QMVC1.0,非常感興趣,用了半月的時間學習,真的感覺收益非淺,在此聲明非常感謝吾修大哥的分享!
??? 1、輕快簡單,框架就幾個類,簡單,當然代碼少也就運行快!單純的MVC,使的如果你想擴展框架,可以輕易的在QMVC上增加和減少功能,也就是說更容易的去修改和讀懂源碼。
??? 2、可以與webform框架融合,也就是說你用webform和mvc共同在同一個項目中運行。
??? 3、QMVC APP開發,QMVC APP可以輕易實現多個QMVC項目合并到一個項目中運行,也可以輕易將其分離開獨立運行,比如一個網站常有論壇、文章系統、新聞系統等,如果你的程序用qmvc app,哪么可以輕易實現多個系統的融合。
??? 本文主題:“QMVC高級開發”,所謂高級我可不認為就是學不會,搞不懂的忽悠者是高級!而是高與初級的層面上知識,所以在此,我假設你己經懂了QMVC的基礎級應用,如果想了解QMVC的初級應用,可以參考我寫的一篇文章《高性能.NET MVC之QMVC》,或QMVC官網(www.wuxiu.org)。
??? 怎樣的框架是最適合你的?哪么豪無疑問,最適合你的框架,什么是最適合自己的?肯定是量身定制的!就像是如果說qmvc,他的代碼非常少,層次簡單,邏輯清晰,簡單。你可以通過基于QMVC輕易擴展成適合自己系統的框架!本文就談談如何擴展自己的MVC APP框架、談談QMVC源碼結構!
??? 1、QMVC源碼分析
??? 首先QMVC源碼中存在兩種MVC模式,一種是QMVC基本框架,一種是QMVC APP框架,QMVC APP的代碼是基于QMVC基本框架實現的,源碼中APPS目錄中存的是關于QMVC APP框架的實現代碼。根目錄下是QMVC基本框架,Router為QMVC的路由功能,用HTTP請求地址的分析。
??? ControllerBase類??? 所有控制器的基類
??? IMVCModel??模型調用接口,當然你的Model也可以不繼承于此接口,如果想在Model中調用QMVCRazorPage類,哪么可以實現接口中獲取。
??? MVCRazorPageBase類? 是關于View模板的基類
???? QMVCCore類????????? QMVC框架的核心類,控制qmvc運行的支持者。
??? ViewResult類??????? 是Controller傳值給QMVCCore去調用Razor模板時的信息類,Controller把要顯示的信息給ViewResult,QMVCCore通過ViewResult加載Razor模板。
??? Router.IRouterProvider接口?? 如果你想重寫QMVC的路由功能,哪么可以實現Router.IRouterProvider接口實現。
??? 至于APPS中的類于以上的類類似,并且實現了固定的Router。
??? 如果你想重寫模板顯示路徑規則可以重寫ControllerBase類中的getTemplateUrl方法,這無疑對你編寫自己的框架起到了最大控制的空間,原方法代碼:
protected virtual string getTemplateUrl(string themeName,string controllerName,string viewName) {return "~/" + themeName + "Views/" + controllerName + "/" + viewName + ".cshtml"; }DefaultRouter類
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Web;namespace wuxiu.QMVC.Router {public class DefaultRouter : IRouterProvider{string DefaultController;string DefaultAction;RouterControllerCollection controllers = new RouterControllerCollection();public DefaultRouter(Assembly asm, string defaultController, string defaultAction){DefaultController = defaultController;DefaultAction = defaultAction;// controllers.LoadAssembly(asm);}public ControllerBase LoadUrl(HttpContextBase context, string apprawurl){string controllerName = DefaultController;string action = DefaultAction;string pageurl;if (apprawurl.IndexOf('?') != -1){pageurl = apprawurl.Substring(0, apprawurl.IndexOf('?'));}else pageurl = apprawurl;string[] urls= Utils.ClearStrArrayEmpty(pageurl.Split('/'));string[] urldata;if(urls.Length>0){controllerName=urls[0];}else controllerName=DefaultController;if(urls.Length>1){action=urls[1];if (!action.EndsWith(".action",StringComparison.OrdinalIgnoreCase)){return null;} action = action.Substring(0,action.Length - ".action".Length);}else action=DefaultAction;if(urls.Length>2){urldata=new string[urls.Length-2];for(int i=2;i<urls.Length;i++)urldata[i-2]=urls[i];}else urldata=new string[]{};Type ControllerType = controllers.GetController(controllerName);if (ControllerType != null){ControllerBase controller = Activator.CreateInstance(ControllerType) as ControllerBase;controller.init(context, controllerName, action, urldata);return controller;}return null;}} }QMVC默認路由器類,沒有實現正則表達式,其實我覺得這是一個好事,因為使用字符分析更準確性能更佳。DefaultRouter類中實現了IRouterProvider接口,在LoadUrl函數中分析了http請求地址,并且通過反射的方式調用的控制器中的方法。
?? 2、QMVC APP介紹
QMVC APP的實現目的是為了實現多個項目融合提出的解決方案,當然如果你的程序按照QMVC APP模式開發,可以很容易的實現與另一個APP之間融合到一個站點中運行。 如果你的項目按照QMVC APP模式開發,哪么Controller是繼承自wuxiu.QMVC.APPS.APPController基類,每一個應用中必須實現APPProvider類。每個應用中存放app.config文件。
??? QMVC APP目錄結構
??? APPS
?? APPName
????? DefaultViews
???????? ControllerName
??????????? ActionName.cshtml
???????? ...
????? App.config
Controllers
Models
APPProvider.cs
Global.asax
Web.config
以上樹中,APPS目錄是必須目錄,用于包含當前項目中所有的應用文件夾,APPName是應用的文件夾,其中包括了Views和app.config,Views里存放了應用所用的視圖,app.config中定義了應用的配置信息。
APPProvider.cs是APPS模式中所有應用實現的一個類,他繼承于wuxiu.QMVC.APPS.APPProvider類,該類在QMVC初始化時調用,用于初始化APP。 Models和Controllers文件為當前應用的相關控制器和模型存放目錄。
?? QMVC APP項目配置
若建一個QMVC APP模式的項目,必須以6.2節中定義的目錄結構外,需要修改一些配置文件,讓ASP.NET運行框架支持QMVC APP運行。
Web.config中,添加或修改以下配置項:
<configuration><system.web><compilation debug="true" targetFramework="4.5"><assemblies><add assembly="System.Web.WebPages.Razor2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=14679ed9c77dd5f5" /><add assembly="System.Web.WebPages2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=14679ed9c77dd5f5" /><add assembly="System.Web.Razor2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=14679ed9c77dd5f5" /></assemblies><buildProviders><remove extension=".cshtml"/><addextension=".cshtml"type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor2"/></buildProviders></compilation></system.web><system.webServer><modules runAllManagedModulesForAllRequests="true"/></system.webServer></configuration>
APPS/web.config中,添加或修改以下配置項:
<configuration><configSections><sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor2"><section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor2" requirePermission="false" /><section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor2" requirePermission="false" /></sectionGroup></configSections><system.web></system.web><system.web.webPages.razor><pages pageBaseType="wuxiu.QMVC.MVCRzorPageBase"><namespaces><add namespace="wuxiu.QMVC" /></namespaces></pages></system.web.webPages.razor> </configuration>APPS/APPName/APPProvider.config
<?xml version="1.0" encoding="utf-8" ?><app name="貼吧系統"version="1.0"copyright="bobby"urlFolder="wuxiu"appProviderClass="wuxiu.tiebaAPP.TiebaAPPProvider"assembly="bin:wuxiu.tiebaAPP"enable="true"><appSettings><add key="" value=""/>... </appSettings><customElements></customElements> </app>
如果您創建一個QMVC APP,哪么必須寫一個app.config描述您的應用信息,QMVC會按照您的配置去加載應用,并且把您的配置信息傳給應用。
APP節點屬性
Name?應用的名稱 Version???????????????? 當前應用的版本號 appProviderClass?表示實現wuxiu.QMVC.APPS.APPProvider類的命名空間和類名,用于初始化APP的類。 assembly???????? 當前應用的APPProvider所在的類庫,值有兩種書寫形式:
??????????????????????? 1、file冒號開頭,標識app/bin/目錄下的dll文件名,如:“file:mydll.dll”。
??????????????????????? 2、bin:默認為程序跟目錄Bin目錄下的程序集名稱,如:“bin:mydll”。
說明:推薦使用bin前綴,因為file雖然可以獨立自己的程序目錄,確存在著運行中獨占的問題,可能導致程序運行頁dll不允許移動和刪除。 Enable?標識當前程序是否可用,值有兩個:true或false。
以上章節是翻譯自吾修主頁的QMVC Doumentation章節中關于QMVC APP章節!?????
實現一個自己的AppController
public class HomeController:wuxiu.QMVC.APPS.APPController{public wuxiu.QMVC.ViewResult Index(){return View();} }實現一個IMVCModel類
當在模型類中可以獲取到MVCRazorPage對象無疑將Model的功能增加,他可以更靈活的提供些程序邏輯,減少了Razor模板中的代碼,畢竟Razor是給美工操作的層面代碼。
public class MyModel:wuxiu.QMVC.IQMVCModel{public string LoginPageUrl { get { return page.APPUrlStart + "/user/login.action"; } }wuxiu.QMVC.APPS.APPRazorPage page;public void Init(QMVCRzorPageBase page){this.page = (wuxiu.QMVC.APPS.APPRazorPage)page;}}?
轉載于:https://www.cnblogs.com/jsmblog/p/qmvc_app.html
總結
以上是生活随笔為你收集整理的谈谈.NET MVC QMVC高级开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在分页后web报表的最后一页补足空行的方
- 下一篇: asp.net ajax控件工具集 Au