這聽起來像是使用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";
}
這將使用不同的刀片佈局爲每個子域。
順便說一句 - 您的系統被稱爲多租戶系統/架構。有關於這個話題的一些非常好的mvc相關問題。例如http://stackoverflow.com/search?q=asp.net-mvc+multi-tenant。 – Ahmad 2011-03-18 05:57:07
謝謝艾哈邁德! – 2011-03-18 06:35:59