2011-03-17 82 views
3

我建立一個MVC 3應用程序。應用程序應該能夠根據子域(例如:customer1.mysite.com - > layout1; customer2.mysite.com - > layout2等)顯示不同的佈局,它也將具有用於移動和IE 6.MVC 3佈局和控制器

我已經看到他們是我可以利用邏輯來設置佈局的_ViewStart.cshtml。但是我沒有得到的是控制器在哪裏呢?我應該在視圖中編寫所有代碼嗎?

佈局中的其他問題如何將常見行爲的代碼分解出來?你有控制器嗎?

最後一個我已經看到了asp.net MVC2領域的概念,現在已經過時了,我們有Razor?

謝謝您的幫助

弗雷德

+0

順便說一句 - 您的系統被稱爲多租戶系統/架構。有關於這個話題的一些非常好的mvc相關問題。例如http://stackoverflow.com/search?q=asp.net-mvc+multi-tenant。 – Ahmad 2011-03-18 05:57:07

+0

謝謝艾哈邁德! – 2011-03-18 06:35:59

回答

1

雖然你可以做到這一點的_ViewStart我認爲一個更好的方式是基於用戶代理或域寫在一個custom view engine包括不同的佈局。然後你會有共同的控制器和視圖,只有佈局會有所不同。

+0

謝謝Darin,非常有趣的選擇。 我已經看到,但沒有任何樣品。你知道有人已經嘗試過嗎? http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx: :「重要提示:由於_ViewStart.cshtml允許我們編寫代碼,因此我們可以選擇使我們的佈局選擇邏輯更加豐富,而不僅僅是基本的屬性集合。例如:我們可以根據訪問網站的設備類型來改變我們使用的佈局模板 - 並且針對這些設備優化了手機或平板電腦的佈局,以及針對個人電腦/筆記本電腦的桌面優化佈局。「 – 2011-03-17 13:57:31

2

這聽起來像是使用ViewBag的好時機。

想法是,在OnActionExecuting期間,您將查找子域並將其推入ViewBag中。這可以在其他控制器繼承的自定義BaseController中完成,也可以從ActionFilter完成。

然後,在您的_ViewStart中,您可以在ViewBag上編寫一個switch語句來控制佈局。

例如,下面是一個ActionFilter,它將在您的任何Razor視圖中填充@ViewBag.Subdomain,包括_ViewStart.cshtml。

public class AddSubdomainToViewDataAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var subdomain = filterContext.HttpContext.Request.Url.Authority.Split('.').First(); 
     var controller = filterContext.Controller as Controller; 
     controller.ViewData.Add("Subdomain", subdomain); 
    } 
} 

然後,用這個新的[AddSubdomainToViewData]屬性修飾您的控制器。

最後,在_ViewStart.cshtml,做這樣的事情:

@{ 
    Layout = "~/Views/Shared/" + ((@ViewContext.ViewData["Subdomain"] as String) ?? String.Empty) + "_layout.cshtml"; 
} 

這將使用不同的刀片佈局爲每個子域。

+0

謝謝波特曼, 你會建議最好使用動作過濾器或直接去那樣: – 2011-03-17 14:26:32

+0

對不起,我按下輸入... @ { var subdomain = this.Context.Request.Url.Authority.Split('。')。First(); Layout =「〜/ Views/Shared /」+((@ ViewContext.ViewData [「Subdomain」] as String)?? String.Empty)+「_layout.cshtml」; } ' – 2011-03-17 14:28:36

+0

如果你只*使用子域名,那麼忽略ActionFilter,並直接在你的ViewStart中使用HttpContext。但我猜測你要使用子域進行數據庫查找,在這種情況下,你應該封裝在ActionFilter中。 – Portman 2011-03-21 18:04:43