天天看點

ASP.NET MVC 重寫RazorViewEngine實作多主題切換

在ASP.NET MVC中來實作主題的切換一般有兩種方式,一種是通過切換皮膚的css和js引用,一種就是通過重寫視圖引擎。通過重寫視圖引擎的方式更加靈活,因為我不僅可以在不同主題下面布局和樣式不一樣,還可以讓不同的主題下面顯示的資料條目不一緻,就是說可以在某些主題下面添加一下個性化的東西。

    我們先來看下效果:

ASP.NET MVC 重寫RazorViewEngine實作多主題切換
ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    在這裡,我使用了分區域、分子產品(按獨立的業務功能劃分)的方式,一個子產品就是一個獨立的dll,在這裡Secom.Emx.Admin和Secom.Emx.History就是兩個獨立的子產品,并分别建立了區域Admin和History,當然你可以在獨立子產品下面建立多個區域。

ASP.NET MVC 重寫RazorViewEngine實作多主題切換
ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    你會發現Secom.Emx.Admin模型下面的Areas目錄和Secom.Emx.WebApp中的目錄是一模一樣的,其實我最初不想在子產品項目中添加任何的View,但是為了友善獨立部署還是加了。右鍵單擊項目Secom.Emx.Admin,選擇“屬性”——“生成事件”添加如下代碼:

    這指令很簡單,其實就是當編譯項目Secom.Emx.Admin的時候,将項目中的Views複制到Secom.Emx.WebApp項目的指定目錄下。

ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    區域配置檔案我放置到了Secom.Emx.WebApp中,其實你完全可以獨立放置到一個類庫項目中,因為注冊區域路由的後,項目最終會尋找bin目錄下面所有繼承了AreaRegistration類的,然後讓WebApp引用這個類庫項目,Secom.Emx.WebApp項目添加Secom.Emx.Admin、Secom.Emx.History的引用。

ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    AdminAreaRegistration代碼如下:

ASP.NET MVC 重寫RazorViewEngine實作多主題切換
ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    注意命名空間和後面添加的 namespaces:new string[1] { "Secom.Emx.Admin.Areas.Admin.Controllers" },這個命名空間就是獨立子產品Secom.Emx.Admin下面的控制器所在的命名空間。HistoryAreaRegistration代碼如下:

ASP.NET MVC 重寫RazorViewEngine實作多主題切換

 View Code

    我們先看下RazorViewEngine的原始構造函數如下:

ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    然後建立CustomRazorViewEngine繼承自RazorViewEngine,對View的路由規則進行了重寫,既然可以重寫路由規則,那意味着,你可以任意定義規則,然後遵守自己定義的規則就可以了。需要注意的是,要注意路由數組中的順序,查找視圖時,是按照前後順序依次查找的,當找到了視圖就立即傳回,不會再去比對後面的路由規則。為了提升路由查找效率,我這裡删除了所有vbhtml的路由規則,因為我整個項目中都采用C#語言。

ASP.NET MVC 重寫RazorViewEngine實作多主題切換
ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    重寫後,我們的路由規則将是這樣的:當沒有選擇主題的情況下,沿用原來的路由規則,如果選擇了主題,則使用重寫後的路由規則。

新的路由規則:在選擇了主題的情況下,優先查找thems/主題名稱/views/Areas/區域名稱/控制器名稱/視圖名稱.cshtml,如果找不到再按照預設的路由規則去尋找,也就是Areas/區域名稱/Views/控制器名稱/視圖名稱.cshtml。

可以看到我們查找模闆頁的方式也被修改了,是以對于一些通用的,隻要換模闆頁就可以了,不需要添加view界面,因為指定主題下面找不到view會去預設主題下面找,而view界面會引用模闆頁的,對于一些個性化的東西,再去指定的主題下面添加新的view,不知道我這樣表述你有明白沒,感覺比較饒,反正就是你可以按照你自己的規則去找視圖,而不是asp.net mvc預設的規則。

ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    切換主題View代碼:

ASP.NET MVC 重寫RazorViewEngine實作多主題切換
ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    當使用者登入成功的時候,從Cookie中讀取所選主題資訊,當Cookie中沒有讀取到主題記錄時,則從Web.config配置檔案中讀取配置的主題名稱,如果都沒有讀取到,則說明是預設主題,沿用原有的視圖引擎規則。在背景管理界面,每次選擇了主題,我都将主題名稱存儲到Cookie中,預設儲存一年,這樣當下次再登入的時候,就能夠記住所選的主題資訊了。

ASP.NET MVC 重寫RazorViewEngine實作多主題切換
ASP.NET MVC 重寫RazorViewEngine實作多主題切換

    Utils類:

ASP.NET MVC 重寫RazorViewEngine實作多主題切換

     實作方式實在是太簡單,簡單得我不知道如何表述才好,我還是記下來,友善有需要的人可以查閱,希望可以幫到你們。由于項目引入了龐大的各種相關檔案以緻檔案比較大,網速原因無法上傳源碼還望見諒!

本文轉自鄒瓊俊部落格園部落格,原文連結:http://www.cnblogs.com/jiekzou/p/7084827.html,如需轉載請自行聯系原作者

繼續閱讀