Modo corretto di utilizzare _viewstart.cshtml e le viste Razor parziali?


156

Sto usando _viewstart.cshtml per assegnare automagicamente lo stesso layout di rasoio alle mie viste.

È un file semplice morto nella radice della mia cartella Views che assomiglia a questo:

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

È più ASCIUTTO che aggiungere la direttiva @Layout a ogni singola vista.

Tuttavia, ciò rappresenta un problema per le viste parziali di Razor , poiché eseguono il contenuto di _viewstart.cshtml e pertanto si assegnano erroneamente un layout, il che le rende, ehm, non più parziali.

Ecco un ipotetico progetto che mostra il file _viewstart.cshtml, il file condiviso _layout.shtml e una vista parziale ("AnonBar.cshtml").

Esempio di struttura del progetto

Attualmente, il modo in cui mi sto aggirando è aggiungendo la seguente riga a ogni vista parziale:

@{
    Layout = "";
}

Questo sembra il modo sbagliato di indicare una vista come parziale in Razor. (Si noti che a differenza del motore di visualizzazione dei moduli Web, l'estensione del file è la stessa per le viste parziali.)

Altre opzioni che ho considerato ma che sono anche peggio:

  • Mettendo tutte le viste parziali in una cartella comune, in modo che possano condividere un _viewstart.cshtml comune. Ciò rompe la convenzione delle viste che si trovano nella stessa cartella del loro controller.
  • Non usare viste parziali.

È qualcosa che viene ancora messo a punto dal team del motore di visualizzazione Razor o mi manca un concetto fondamentale?


3
Ci scusiamo per l'offtopico, ma quali sono quelle icone accanto ai nomi dei file? :) Qualche tipo di controllo del codice sorgente giusto?
Alex

6
@jitbit: VisualSVN
erigere il

Risposte:


237

Se return PartialView()dai controller (anziché return View()), _viewstart.cshtmlnon verrà eseguito.


6
Ah, non sapevo della PartialViewResultclasse. Era quello di cui avevo bisogno.
Portman,

6
Come follow-up, ho scoperto che devo anche impostare esplicitamente il tipo di ritorno del metodo di azione PartialViewResultinvece del solito ActionResult.
Portman,

2
@Portman stai riscontrando problemi quando il tipo restituito dal metodo di azione non lo è ActionResult? Sono sorpreso che questo sia un problema perché il runtime MVC non dovrebbe comportarsi in modo diverso in questo caso (vale a dire fino a quando il tipo restituito dal metodo di azione è ActionResulto qualsiasi classe derivata da esso le cose dovrebbero semplicemente funzionare).
marcind

@marcind Ottengo uno Stack Overflow su w3wp.exe se imposto il tipo restituito su ActionResult. Funziona bene se il tipo restituito è PartialViewResult. Pensi di dover presentare un bug di Connect?
Portman,

A me sembra uno di questi: grida se invii un bug di Connect, lo voterai.
Dav,
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.