Forza tutte le aree a utilizzare lo stesso layout


88

Ho la seguente struttura di progetto:

  • / Views / Shared / _Layout;

  • / Aree / Area1 / Views / ControllerName / Index;

...

  • / Aree / AreaN / Views / ControllerName / Index.

Esiste un modo per forzare tutte le aree a utilizzare _Layout come layout di base ?

C'è un modo per farlo senza aggiungere il file _ViewStart (ad esempio, tramite la configurazione del routing)?

Guarda anche:

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


Risposte:


155

Devi solo aggiungere un file denominato:

_ViewStart.cshtml

Sotto ogni cartella delle viste di area:

/Areas/Area1/Views/_ViewStart.cshtml

E modifica il file in modo che punti al layout principale in questo modo:

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

Affinché funzioni, non devi specificare un valore nella proprietà di layout della vista, se lo fai, sovrascriveresti il ​​layout globale

Nota: Come detto Tony, si potrebbe modificare il layout di proprietà di ogni vista al punto al layout radice, tuttavia questo non è il metodo consigliato per farlo dal momento che si sarebbe accoppiamento tue opinioni con il layout e cambiare sarebbe doloroso

Modifica 1

Se desideri utilizzare il codice per impostare il layout della visualizzazione predefinita, forse dovresti considerare di scrivere un motore di visualizzazione personalizzato.

Prova a google su personalizzato RazorViewEngineeRazorView

Questo articolo potrebbe essere un buon punto di partenza

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

Non ho fatto qualcosa del genere ma spero di indicarti la giusta direzione


1
C'è un modo per farlo senza aggiungere il file "_ViewStart" (ad esempio, tramite la configurazione del routing)?
Mikhail

2
All'interno del percorso non credo. Sono due cose differenti. Il routing è incaricato di provare a far corrispondere l'URL della richiesta corrente con una route registrata in RoutesTable, quando viene trovata una corrispondenza, viene creato un IMvcRouteHandler e quindi un IHttpHandler (MvcHandler) è incaricato di elaborare l'azione del controller. Come puoi vedere, questo non ha nulla a che fare con le visualizzazioni né i layout. Questo perché un percorso non restituisce necessariamente una vista, potrebbe restituire json o xml. Quindi il routing non è il posto corretto per implementare qualcosa di simile.
Jupaol

È inoltre possibile aggiungere _ViewStartdirettamente nella cartella Area per applicarlo a tutte le aree.
Artur

21

Espandendo la risposta di Jupaol ....

Almeno in VS2013, il file _ViewStart.cshtml viene aggiunto per impostazione predefinita durante la creazione dell'area, quindi è già presente e puoi modificare il contenuto mentre osserva in modo che punti alla radice _Layout.cshtml. È quindi possibile rimuovere _Layout.cshtml nell'area, poiché non è più utilizzato (e ora è una potenziale fonte di confusione)

Tuttavia, così facendo qualsiasi instradamento eseguito in quella radice _Layout.cshtml dovrà considerare le aree.
Il _Layout.cshtml predefinito ha una serie di helper ActionLink che richiedono una leggera modifica:

Aggiungi il parametro RouteValueDictionary a qualsiasi chiamata ActionLink impostando Area = "". Nota che la stringa vuota si riferisce al livello principale. Ciò consentirà a questi collegamenti di funzionare correttamente quando vengono richiamati dall'interno di un'area, continuando a funzionare se richiamati dalla radice.

per esempio:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>

2

Specifichi un layout utilizzando:

@ {Layout = "_Layout"; }

Se vuoi renderlo più facile, cambia tutto in una volta. Forse potresti semplicemente impostarlo come una variabile del sacchetto di visualizzazione e passarlo al controller. Per renderlo ancora più semplice, potresti creare un controller di base da cui ereditano gli altri controller e assegnargli il layout alla borsa di visualizzazione.

Non sono sicuro del motivo per cui il percorso dovrebbe cambiare o forse non capisco. Spero che sia di aiuto :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.