Comment utiliser _viewstart.cshtml et les vues Razor partielles?

156

J'utilise _viewstart.cshtml pour attribuer automatiquement la même disposition de rasoir à mes vues.

C'est un fichier simple mort à la racine de mon dossier Views qui ressemble à ceci:

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

C'est plus DRY que d'ajouter la directive @Layout à chaque vue.

Cependant, cela pose un problème pour les vues partielles de Razor , car elles exécutent le contenu de _viewstart.cshtml et s'attribuent donc incorrectement une mise en page, ce qui les rend, euh, non partielles.

Voici un projet hypothétique, montrant le fichier _viewstart.cshtml, le fichier _layout.shtml partagé et une vue partielle ("AnonBar.cshtml").

Exemple de structure de projet

Actuellement, la façon dont je contourne ce problème consiste à ajouter la ligne suivante à chaque vue partielle:

@{
    Layout = "";
}

Cela semble être la mauvaise façon de désigner une vue comme partielle dans Razor. (Notez que contrairement au moteur d'affichage des formulaires Web, l'extension de fichier est la même pour les vues partielles.)

D'autres options que j'ai envisagées mais qui sont encore pires:

  • Mettre toutes les vues partielles dans un dossier commun, afin qu'elles puissent partager un _viewstart.cshtml commun. Cela rompt la convention des vues étant dans le même dossier que leur contrôleur.
  • Ne pas utiliser de vues partielles.

Est-ce quelque chose qui est encore en cours d'élaboration par l'équipe Razor View Engine, ou est-ce que je manque un concept fondamental?

Portman
la source
3
Désolé pour offtopic, mais quelles sont ces icônes à côté des noms de fichiers? :) Une sorte de contrôle de source, non?
Alex
6
@jitbit: VisualSVN
érict

Réponses:

237

Si vous return PartialView()de vos contrôleurs (au lieu de return View()), alors _viewstart.cshtmlne sera pas exécuté.

Marcind
la source
6
Aha, je ne savais pas pour la PartialViewResultclasse. C'était ce dont j'avais besoin.
Portman
6
En guise de suivi, j'ai constaté que je devais également définir explicitement le type de retour de la méthode d'action sur au PartialViewResultlieu de l'habituel ActionResult.
Portman
2
@Portman rencontrez-vous des problèmes lorsque le type de retour de la méthode d'action n'est pas ActionResult? Je suis surpris que ce soit un problème car le runtime MVC ne devrait pas se comporter différemment dans ce cas (c'est-à-dire tant que le type renvoyé par la méthode d'action est ActionResultou toute classe dérivée de celle-ci, les choses devraient simplement fonctionner).
marcind
@marcind J'obtiens un débordement de pile sur w3wp.exe si je règle le type de retour sur ActionResult. Fonctionne bien si le type de retour est PartialViewResult. Vous pensez avoir besoin de signaler un bogue Connect?
Portman
Cela me semble être un problème - répondez si vous soumettez un bogue Connect, le votera.
Dav