J'ai un site MVC3 utilisant Razor comme moteur de visualisation. Je veux que mon site soit skinnable. La plupart des habillages possibles sont suffisamment similaires pour pouvoir être dérivés d'une mise en page principale partagée.
Par conséquent, j'envisage cette conception :
Cependant, j'aimerais pouvoir appeler RenderSection
dans la couche inférieure, _Common.cshtml
et faire en sorte qu'il rende une section qui est définie dans la couche supérieure, Detail.cshtml
. Cela ne fonctionne pas : RenderSection
ne rend apparemment que les sections qui sont définies dans la couche supérieure suivante.
Bien sûr, je peux définir chaque section dans chaque peau. Par exemple, si _Common
doit appeler RenderSection("hd")
pour une section définie dans Detail
je place simplement ceci dans chaque _Skin
et ça marche :
@section hd {
@RenderSection("hd")
}
Cela entraîne une certaine duplication du code (puisque chaque peau doit maintenant avoir cette même section) et est généralement désordonné. Je suis encore novice en matière de Razor et j'ai l'impression de passer à côté de quelque chose d'évident.
Lors du débogage, je peux voir la liste complète des sections définies dans WebViewPage.SectionWritersStack. Si je pouvais simplement dire à RenderSection de parcourir toute la liste avant d'abandonner, il trouverait la section dont j'ai besoin. Hélas, SectionWritersStack n'est pas public.
Sinon, si je pouvais accéder à la hiérarchie des pages de mise en page et tenter l'exécution de RenderSection dans chaque contexte différent, je pourrais localiser la section dont j'ai besoin. Je rate probablement quelque chose, mais je ne vois aucun moyen de faire cela.
Existe-t-il un moyen d'atteindre cet objectif, autre que la méthode que j'ai déjà exposée ?