Voici le About.cshtml du modèle MVC 3 par défaut:
@{
ViewBag.Title = "About Us";
}
<h2>About</h2>
<p>
Put content here.
</p>
Je m'attendrais à ce qu'une référence au fichier _ViewStart soit trouvée dans le About.cshtml
, mais ce n'est clairement pas le cas.
J'ai regardé dedans global.asax
et web.config
, mais je ne peux pas découvrir comment le About.cshtml
fichier est "lié" avec la mise en page du fichier _ViewStart.
Tout fonctionne comme prévu, je voudrais juste savoir ce qui se passe sous le capot ...
ViewLocationFormats = ViewLocationFormats.Union(new string[] { "~/Inspinia/ExampleViews/{1}/{0}.cshtml" }).ToArray();
. Par conséquent, j'ai dû ajouter une copie de mon fichier _ViewStart.cshtml à "~ / Inspinia / ExampleViews", sinon il n'a pas été récupéré et aucune disposition n'a été définie._ViewStart
dans chaque sous-dossier qui sera lié aux vues de ce sous-dossier?Dans un sens plus général, cette capacité du framework MVC à "connaître" _Viewstart.cshtml est appelée "Codage par convention".
Wikipédia
Il n'y a pas de magie. Il vient d'être écrit dans la base de code principale du framework MVC et est donc quelque chose que MVC "connaît". C'est pourquoi vous ne le trouvez pas dans les fichiers .config ou ailleurs; c'est en fait dans le code MVC. Vous pouvez cependant remplacer pour modifier ou annuler ces conventions.
la source
Juste une autre pensée.
Si vous voulez avoir votre propre
cshtml
fichier comme modèle commun, vous pouvez le faire de cette façonDans votre,
_viewstart.cshtml
vous pouvez mentionner votrecshtml
fichier commun .la source
Le code source est un bien meilleur endroit pour rechercher cela que la documentation.
Référençant le code MVC 6 de Github, nous avons quelques fichiers intéressants
----mettre à jour----
En raison des modifications de la structure source, les informations sur la façon dont les pages viewstart sont rassemblées peuvent désormais être trouvées dans RazorViewEngine.cs chercher la fonction "GetViewStartPages".
----/mettre à jour----
Pour répondre à la façon dont ils entrent en jeu, regardez RazorView , qui je crois (à cause d'IView) est lié au pipeline MVC. Ce fichier possède une méthode RenderAsync qui est appelée à partir du pipeline MVC pour rendre la vue demandée.
RenderAsync fait des appels à RenderPage ET ALORS RenderLayout (NOTEZ L'ORDRE). La RenderPage effectue d'abord des appels pour traiter les fichiers viewstart (notez au pluriel, il pourrait y avoir plus d'un fichier _viewstart).
Ainsi, les informations que vous recherchez peuvent être obtenues à partir de la fonction RenderViewStartAsync dans le fichier RazorView.cs sous l'espace de noms Microsoft.AspNet.Mvc.Razor.
la source
Cela peut ajouter des informations supplémentaires à cette question maintenant (2016 ala MVC4, MVC5).
Le moteur Razor recherche et exécute le code dans _ViewStart.cshtml avant tout autre code qui se trouve dans le même répertoire ou sous-répertoire où se trouve _ViewStart.cshtml .
Toute vue peut remplacer la propriété Layout ou l'une de ses valeurs.
J'ai pensé que je pourrais ajouter un peu plus d'informations pour vous montrer pourquoi c'est _ViewStart.
Si vous obtenez ILSpy et examinez le code dans RazorViewEngine (System.Web.Mvc.dll), vous verrez que le code lui-même fait référence à ce nom.
Vous pouvez voir que RazorViewEngine recherche un fichier avec ce nom:
la source
Si vous souhaitez avoir une mise en page commune pour vos pages, vous devez définir la mise en page commune et associer une vue à la mise en page, nous devons définir la propriété de mise en page sur chaque vue, cela viole le principe DRY (Don't Repeat Yourself). Pour cela .Net Framework a fourni le fichier "_ViewStart.cshtml", placé à l'intérieur du dossier de vue. Nous plaçons les informations de disposition dans le fichier "_ViewStart.cshtml" et chaque vue utilise par défaut ces informations de disposition. Si vous souhaitez donner des informations de mise en page différentes, supposons pour votre vue d'accueil, vous pouvez créer un nouveau "_ViewStart.cshtml" en référence à cette mise en page et le placer dans le dossier "Vue d'accueil".
la source
La réponse courte est : ViewStarts démarre en premier lorsqu'une vue est rendue. La longue histoire est ci-dessous:
L'histoire de la création d'un fichier de vue unique:
J'espère que cela vous fera prendre conscience de ce qui se passe réellement à l'intérieur des mystères inconnus du cycle de vie de votre programme.
la source