2013-04-02 20 views
0

好吧,所以我正在構建一個頁面,最終將根據請求主機進行品牌化。例如,如果用戶瀏覽www.firsthost.com,我的過濾器會檢測到此信息並將其設置爲品牌1.如果用戶瀏覽到www.secondhost.com,我的過濾器會檢測到它並將其設置爲品牌2.這些品牌ID用於動態選擇頁面上的資產和選項。如何根據請求中的主機標記網頁?

目前,我正在做的是在ActionFilter中做出這個決定,並將品牌ID填充到會話中,然後在控制器中引用它,我使用它來構建具有正確引用和資源的視圖模型。我不喜歡這個,就是我必須創建一個方法,將該品牌ID從會話中挖掘出來,並用控制器中的每個動作調用它,而且我真的不喜歡將它填充到會話中的想法無論是。很明顯,我想要隱藏用戶,所以我真的不想把它放入cookie中。

有沒有人接觸過這個?你是如何解決這個問題的?我只是尋找一種更安全的方式來實現這個功能,如果框架已經有了一些可以幫助的功能,我寧願使用它。

回答

1

您可以在過濾器中執行此操作,並將品牌信息傳遞給ViewBag中的視圖。像這樣將概念工作:

public class SetBrandFilter : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewBag.Brand = GetBrandInformationForHost(filterContext.HttpContext.Request.Url.Host) 
    } 
} 

你可以把這個過濾器進入一個屬性並將其應用到您的控制器(或基礎控制器),或將其註冊爲一個全球性的過濾器。您可以處理此過濾器中的所有品牌數據,因此您不必擔心自己的行爲。

這類似於你現在在做什麼,但不是使用會話(這是不是你身邊掠過的數據類型確有必要,因爲它只涉及到一個請求)使用ViewBag。

+0

你知道嗎,我甚至沒有注意到我在那裏有一個控制器參考。我測試它工作。讓我再玩一遍,確保它堅實。謝謝! – Sinaesthetic

+0

不客氣:)您應該可以加載過濾器中的所有品牌數據,並完全忽略您的行爲中的品牌。 ViewBag上的品牌數據將直接發送到視圖。 – 2013-04-02 00:54:39

+0

哦,我不確定我想那麼做。無法爲所有頁面加載品牌特定資產。儘管它適用於大多數情況,但某些頁面可能比其他頁面顯示的要多得多,我不想在每次過濾器被擊中時加載它們。實際上,這些視圖模型是根據需要創建的。 – Sinaesthetic

相關問題