2010-12-12 35 views
1

J'ai une mise en page de base, BaseLayout.cshtml:contenu par défaut dans la mise en page imbriquée

<html> 
<body> 
    @RenderBody() 
    <div id="footer"> 
     @if (!IsSectionDefined("Footer")) { 
      Default footer markup 
     } 
     else { 
      @RenderSection("Footer") 
     } 
    </div> 
</body> 
</html> 

Je tire une mise en page imbriquée de cela, WithSidebar.cshtml:

@{ Layout = "BaseLayout.cshtml"; } 

<div> 
    <div> 
     @RenderBody() 
    </div> 
    <div>Sidebar</div> 
</div> 

Quels changements doivent être effectués à la mise en page WithSidebar:

  1. Pour activer la section Pied de page dans BaseLayout dans une vue?
  2. Ne pas remplacer le pied de page par défaut et s'en tenir à celui défini dans BaseLayout?

Je suis en développement contre ASP.NET MVC 3 RC2. J'ai lu cette entrée par Marcin Dobosz: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-sections-with-default-content.aspx mais je ne le fais pas proprement à travers des mises en page imbriquées.

+0

Cette question a été reproduite sur http://forums.asp.net/t/1632953.aspx – XIII

+0

Je suis désolé. Je venais d'ajouter une URL à cette page à l'origine. Un modérateur doit avoir copié la question. – kidoman

Répondre

2

Ma technique originale nécessite quelques fonctionnalités supplémentaires. J'ai écrit un new post qui résout le problème:

+0

Merci pour le blog détaillé Marcin :) Et l'explication ... Je me demande si nous pourrions éviter l'exigence «this» en l'ajoutant implicitement (lors de l'analyse) dans le moteur Razor? Je continuerais également à travailler sur des aides existantes (Html, Url, etc.) Certaines heuristiques seraient nécessaires dans les cas de bords. Mais entraînerait une syntaxe plus propre: @RedefineSection (....) au lieu de: @ this.RedefineSection (...) : Quelle est la nécessité de passer dans une « lecture seule statique privée objet _o = nouvel objet(); ' par exemple au délégué Func? Cela pourrait-il être évité? – kidoman

+0

Je ne pense pas que nous allons ajouter «ceci» implicitement comme vous le suggérez. Nous devrons détecter si vous avez déjà une expression comme '@ this.DoSomething()' et ignorer cette casse. On dirait que trop de problèmes pour pas beaucoup de gain. Idéalement, nous allons simplement ajouter ces méthodes à la classe 'WebPageBase' afin qu'elle soit toujours disponible. – marcind

+0

En ce qui concerne '_o = new object()', c'est parce que les modèles de razor inline sont en réalité 'Func ', donc vous devez passer quelque chose. Je pourrais passer 'null' mais à cause de la façon dont les choses fonctionnent template a accès au paramètre 'item' lambda afin que quelqu'un puisse essayer de faire quelque chose avec lui et il obtiendrait une exception NullRefException. Si vous ne touchez pas 'item', cela ne devrait pas avoir d'importance. – marcind

0

Pour remplacer une section:

@section Footer { 
    <div>Put your overriden content here</div> 
} 
+0

Je vais clarifier ma question un peu plus. – kidoman