Я думаю, что вы могли бы просто написать ActionFilter как ...
public class YourCustomLayoutAttribute : ActionFilterAttribute, IResultFilter
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var viewResult = filterContext.Result as ViewResult;
if(viewResult != null)
{
// switch the layout
// I assume Razor will follow convention and take the "MasterName" property and change the layout based on that.
viewResult.MasterName = "CustomLayout";
}
}
}
Я просто написал этот код по месту моих штанов без компилятора, так что он, вероятно, не будет компилироваться, но вы, вероятно, получитеидея.Я думаю, что IResultFilter - правильный интерфейс, который вы хотите, у него есть методы, которые выполняются непосредственно перед отображением представления.Если это правильно, вы сможете изменить MasterName для представления, которое будет отображаться на лету.
Это будет использование кода контроллера.
[YourCustomLayout] // this should trigger your custom action result for all actions
public class MyController : Controller
{
public ActionResult Index()
{
return View("Index", "MainLayout"); // even if you were to use the overload to set a master, the action result should override it as it executes later in the pipeline.
}
}