Вы можете просто добавить свою собственную логику в свои представления или глобальную _ViewStart.cshtml
, которая выбирает правильный макет в зависимости от ваших собственных критериев.В прошлом я добавил свойство ViewData
, поэтому мой _ViewStart.cshtml
выглядит следующим образом:
@{
Layout = (string)ViewData["_OverwriteLayout"] ?? "_DefaultLayout";
}
Так что мне просто нужно установить значение ViewData["_OverwriteLayout"]
где-нибудь внутри конвейера MVC.Я лично сделал это в ResultFilter
, чтобы логика не запускалась при возврате результатов без просмотра.
Это может выглядеть, например, так:
public class CustomLayoutResultFilter : IAsyncResultFilter
{
public Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
if (context.Result is ViewResult viewResult)
{
if (httpContext.Request.Host == "test.example.com")
viewResult.ViewData["_OverwriteLayout"] = "_TestLayout";
}
return next();
}
}