2010-03-17 73 views
0

我有要求支持我的網站頁面的主題。我這樣做的方式是根據當前主題動態選擇母版頁。主題和主頁

我有安裝像這樣

/shared/masterpages/theme1/Master1.master /shared/masterpages/theme1/Master2.master /shared/masterpages/theme1/Master3.master

的目錄結構

/shared/masterpages/theme2/Master1.master /shared/masterpages/theme2/Master2.master /shared/masterpages/theme2/Master3.master

,我仍然使用頁面指令在視圖

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/shared/masterpages/theme1/Master1.Master"%> 

我仍然想利用該視圖的MasterPageFile屬性,只需更改主題目錄。

我只能想到三種方法來做到這一點,沒有一個聽起來很棒。

  1. 創建使用OnPreInit改變像this
  2. 主題創建每個視圖鏈接到母版頁文件,然後將該控制器一些XML文件或數據庫表中的自定義基本視點類。
  3. 建立一些工具,可讀取所有的意見,並分析他們的的MasterPageFile,(類似於2,但可以在運行時可能被完成。)

選項1似乎是最好的選擇對我來說至今。有沒有人有任何想法如何做到這一點?

+0

我們在MVC中有PreInit嗎?請原諒我的無知! – 2010-03-17 19:58:20

+0

是的,我們似乎這樣做,因爲我剛剛編寫了選項1,它的工作原理。 – Jeff 2010-03-17 21:51:38

回答

2

更新建議

因爲正如我所預料我原來的建議沒有發揮出來,下面就來解決它,同時仍保持動作方法清潔,減少碼重複的可能方式:

  1. 創建ActionResult,增加了主名稱/主題名稱/任何信息,你需要選擇正確的母版頁爲ViewData["masterInfo"](或類似的東西)。
  2. 創建一個基類,其中有主題的視圖繼承。當然,你的基類應該繼承自System.Web.Mvc.ViewPage。如果需要,還可以創建一個繼承自.ViewPage<T>的通用版本。
  3. 在您的基類中,創建基於ViewData["masterInfo"]的選擇正確主頁面的構造方法。我不確定是否有需要,但不要忘記在代碼之前或之後運行基礎構造函數,如果有需要運行的代碼。
  4. 用屬性裝飾所有相關操作,並設置它們的視圖以繼承基類而不是System.Web.Mvc.ViewPage

原帖
爲什麼沒有一個ActionFilter,可以在控制器級應用,是設置視圖的MasterPageFile財產?如果覆蓋OnActionExecuted,則測試結果是否爲ViewResult並不是太棘手,並且在這種情況下將屬性更改爲正確的值。

+0

我的理解是,在OnActionExecuted中,您看不到在視圖本身中設置的MasterPageFile屬性。您只能更改由控制器設置的主頁面文件。這是不正確的? – Jeff 2010-03-17 20:33:09

+0

我還沒有真正嘗試過這一點 - 我只是想通過ActionFilter來做到這一點的最佳方式,並且由於您需要將結果實例化,因此必須在控制器操作後執行。你有沒有嘗試過這個,並發現問題?如果是的話,有什麼問題? – 2010-03-17 20:48:31

+0

我剛剛測試過,並且在OnActionExecuted中只有ViewResult,但視圖本身尚未加載,因此您看不到在控制器設置的僅查看母版頁的頁面指令中定義的母版頁。 – Jeff 2010-03-17 21:52:44