这听起来像是使用ViewBag的好时机。
这个想法是在OnActionExecuting期间,您将查找子域并将其推入 ViewBag。这可以在您的其他控制器继承的自定义 BaseController 或ActionFilter中完成。
然后,在你的 _ViewStart 中,你可以在 ViewBag 上写一个 switch 语句来控制布局。
例如,这是一个 ActionFilter,它将填充@ViewBag.Subdomain
到您的任何 Razor 视图中,包括 _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";
}
这将为每个子域使用不同的 Razor 布局。