Penso che si può solo scrivere un ActionFilter come ...
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";
}
}
}
Ho appena scritto questo codice per la sede dei miei pantaloni senza compilatore in modo che probabilmente non si compila, ma probabilmente l'idea . Penso che IResultFilter sia l'interfaccia corretta che desideri, ha metodi che vengono eseguiti immediatamente prima della visualizzazione della vista. Se questo è corretto, dovresti essere in grado di modificare il MasterName per la vista che sta per essere resa al volo.
Questo è l'utilizzo del codice del controller.
[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.
}
}
In realtà non è necessario ereditare direttamente da 'IResultFilter' poiché' ActionFilterAttribute' lo fa già: 'classe pubblica astratta ActionFilterAttribute: FilterAttribute, IActionFilter, IResultFilter'. – Oliver