これは、ViewBagを使用する良い機会のように思えます。
アイデアは、OnActionExecuting中にサブドメインを検索し、それを ViewBag に押し込むというものです。これは、他のコントローラーが継承するカスタム BaseController で、またはActionFilterから行うことができます。
次に、_ViewStart で、ViewBag に switch ステートメントを記述してレイアウトを制御できます。
たとえば、_ViewStart.cshtml を@ViewBag.Subdomain
含む任意の Razor ビューに設定される ActionFilter を次に示します。
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";
}
これにより、サブドメインごとに異なる Razor レイアウトが使用されます。