Come si specificano layout diversi nel file ViewStart del razor ASP.NET MVC 3?

Mi piacerebbe avere 2 layout separati nella mia applicazione. Diciamo che uno è per la sezione pubblica del sito web e l’altro è per il lato membro.

Per semplicità, diciamo che tutta la logica per ciascuno di questi siti è racchiusa ordinatamente in 2 controller distinti.

  • PublicController
  • StaffController

E che ognuno di essi ha un Layout corrispondente per tutte le View sotto ciascuno.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

Come faccio ad usare il file _ViewStart.cshtml per specificare che tutte le viste / azioni sotto “Pubblico” usano il PublicLayout e tutto in “Personale” usa lo StaffLayout?

Grazie!

È ansible inserire un file _ViewStart.cshtml all’interno della cartella /Views/Public che sovrascrive quello predefinito nella cartella /Views e specificare il layout desiderato:

 @{ Layout = "~/Views/Shared/_PublicLayout.cshtml"; } 

Per analogia è ansible inserire un altro file _ViewStart.cshtml all’interno della cartella /Views/Staff con:

 @{ Layout = "~/Views/Shared/_StaffLayout.cshtml"; } 

È anche ansible specificare quale layout deve essere utilizzato quando si restituisce una vista all’interno di un’azione del controller, ma questo è per azione:

 return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel); 

Un’altra possibilità è un filtro di azioni personalizzato che sovrascrive il layout. Come puoi vedere molte possibilità per raggiungere questo objective. Fino a te per scegliere quale si adatta meglio al tuo scenario.


AGGIORNARE:

Come richiesto nella sezione commenti, ecco un esempio di un filtro azione che sceglierebbe una pagina principale:

 public class LayoutInjecterAttribute : ActionFilterAttribute { private readonly string _masterName; public LayoutInjecterAttribute(string masterName) { _masterName = masterName; } public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); var result = filterContext.Result as ViewResult; if (result != null) { result.MasterName = _masterName; } } } 

e quindi decorare un controller o un’azione con questo attributo personalizzato specificando il layout desiderato:

 [LayoutInjecter("_PublicLayout")] public ActionResult Index() { return View(); } 

Un altro metodo è definire il layout all’interno della vista:

  @{ Layout = "~/Views/Shared/_MyAdminLayout.cshtml"; } 

Altri modi per farlo, possono essere trovati qui , spero che questo aiuti qualcuno.

Questo metodo è il modo più semplice per i principianti di controllare il rendering dei layout nell’applicazione ASP.NET MVC. Possiamo identificare il controller e rendere i layout come controllore, per fare ciò possiamo scrivere il nostro codice nel file _ViewStart nella directory principale della cartella Views. Di seguito è un esempio mostra come può essere fatto.

  @{ var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString(); string cLayout = ""; if (controller == "Webmaster") { cLayout = "~/Views/Shared/_WebmasterLayout.cshtml"; } else { cLayout = "~/Views/Shared/_Layout.cshtml"; } Layout = cLayout; } 

Leggi l’articolo completo qui “Come visualizzare layout diversi in ASP.NET MVC”