Asp.net MVC 插件式應用框架


這幾年來做了很多個網站系統,一直堅持使用asp.net mvc建站,每次都從頭開始做Layout,CSS,做權限管理等等,有點惱火,將這幾年的代碼好好整理了一下,准備搭建一個框架。

一、目標

0)面向領域:網站后台管理系統、MIS等結構相對規范的管理類應用;

a)基於Asp.net MVC 4搭建系統框架

b)集成RBAC基於角色的權限管理機制,能夠控制到控件級別

c)集成一些基礎服務:數據字典、日志記錄等

d)使用AJAX特性(使用JQuery與MVC的Partiview等實現)

e)插件機制:框架搭建完畢之后,新開發的功能模塊能夠直接以插件的形式安裝到系統框架中運行

f)使用EF Codefirst

二、系統設計

A)基於RBAC的權限管理系統

參考了園子里一些權限管理系統,使用了  模塊->資源->操作 作為最基礎的權限元素,[資源,操作]作為 基本的權限原子,將權限原子賦給“角色”

為了配合RBAC的使用,繼承 AuthorizeAttribute 來修飾Action

B)菜單框架

此應用框架主要面向管理系統,所以導航菜單設計為兩級,頂部導航為一級菜單,左側 邊為二級菜單,菜單能與權限進行關聯,配置權限時可影響到菜單;如圖所示,Menu2根據所選擇Menu1發生變化;

C)Ajax框架

 此應用框架中,Content Area為Ajax更新內容,使用JQuery的 $.get 操作訪問 Action,在Action中返回 PartialView,然后更新到 ContentArea中;

全部使用Ajax來載入,帶來一個問題,無法使用前進、后退、還有刷新等操作,借鑒網上一些資料,使用了 "jquery.bbq.js"的插件,通過url的hashchange使系統能夠在瀏覽器中保持狀態,能夠使用 “前進“,”后退“,”刷新“等操作;通過將真實的請求代碼加入到URL”#"后,來載入所需要的內容,JS代碼如下:

$(window).bind('hashchange', function (e) {
            var hash = window.location.hash || '';
            if (oldHash == '') {
                // 需要選擇默認菜單
            }
            if (hash != '' && hash != oldHash) {
                if (hash == "#top") {
                    //TODO, Load the index page!!!!
                    return;
                }

                $('#contentPanel').html('<div class="wp"><img src="@Url.Content("~/Content/loading.gif")" border="0" /> &nbsp;載入中...</div>');
                oldHash = hash;

                $.get(hash.substr(1, hash.length - 1), {}, function (data, status) {
                    if (status == "success") {
                        if (data.substr(0, 7) == '"logon"') {
                            window.location = "/Home/Login";
                        } else {
                            $('#contentPanel').html(data);
                        }
                        //}
                    } else {
                        $('#contentPanel').html('error.. - ' + status);
                    }
                }, "html");
            }
        });
        $(window).trigger('hashchange');

 

在這樣的框架中,只需要關注Content Area中的部分視圖即可,在該Content Area中還可以使用Ajax + JSON的方式實現更多的功能;

表單的處理

由於采用了上面的AJAX機制,不能再使用以往的表單提交方式,在本框架中,使用下面幾種方式:

1)使用  $.post(url, $('#form').serialize(), callback, "html") 的方式,將返回值更新到 Content Area中;

2)使用  $.post(url, {'field1','value1'} , callback, "json") 的方式,根據結果,再通過javascript進行頁面跳轉;

D)配套的若干Helper

ajaxMenu,ajaxPager等:由於使用了上面的機制來載入部分視圖,所有的URL都要以 /Home#/Real/Url?para1=value1 的方式來請求,所以寫了一個Helper來完成該功能;分頁也需要做同樣的處理。

E)IoC Container

本例使用了Unity Block作為IoC容器,無他,因為這個比較熟悉;同時將MVC與Unity Container做了整合;

F)表單驗證

由於使用了AJAX框架,unobtrusive擴展的驗證大部分失效,所以直接使用 jquery.validate進行客戶端驗證

G)插件機制

定義IPlugin接口,其中有Initialize方法,在系統啟動時進行初始化,例如初始化Unity Container,MapRoute等等;

插件的使用:直接將插件復制到框架中的插件目錄,並將插件所需要使用的Views文件復制到框架中的Views目錄中。(暫無更好的解決方案,就這樣搞定。考慮復制到插件目錄,重寫MVC中的視圖引擎的代碼來實現在插件目錄中查找視圖)

工作原理:系統啟動時,通過反射載入插件中的Dll,並查找IPlugin接口,調用其初始化方法,插件在Unity容器中注冊所需要使用的控制器,這樣框架中就可以調用到所需要的控制器以及視圖;

插件格式:插件也采用Asp.net mvc 4 Web APP來寫,最后只使用編譯出的DLL與部分必要的View視圖,其他資源均使用框架中的資源;

三、系統實現

1)數據庫:采用了EntityFramework(Version 5.0) - CodeFirst完成,使用Enable Migrations;

2)數據訪問層:定義倉儲模式,IRepository實現基本的增刪查改功能,

3)數據服務層:根據需要進行定義;

4)Portal:采用了Asp.net MVC 4,Razor視圖引擎,JQuery,JQuery UI, JQuery.Validate, jquery.bbq, Jquery BlockUI 等;

5)為面向內容管理,集成了CkEditor與CkFinder

-------------------

目前系統代碼還比較亂,先發個截圖

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM