2009-09-23 4 views
1

Eh bien, je suis un peu déconcerté!Blocs de code intégrés dans masterpage et page

« problème simple »

Je partie de ma page principale que je veux rendre différemment selon si oui ou non un ContentPlaceHolder est vide.

Alors:

J'ai une page principale qui comme un code comme:

<% if (ContentPlaceHolder1.HasControls()) {%> 
    <div id="LittleDiv"> 
<% } else { %> 
    <div id="BigDiv"> 
<% } %> 
     some text 
    </div> 

<% if (ContentPlaceHolder1.HasControls()) {%> 
    <div id="Div1"> 
     yadda yadda yadda 
     [<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"/>] 
     blah blah blah 
    </div> 
<% } %> 

J'ai une page qui a un code le long des lignes de:

<asp:Content ID="Content1" runat="server" contentplaceholderid="ContentPlaceHolder1"> 
    <% if (Model.SomeValue) { %> 
     hello! 
    <% } %> 
</asp:Content> 

(note : la logique dans le bloc de code incorporé de la page d'exemple peut être unique, pour chaque détenteur de contenu, pour chaque page!)

Ce qui semble bien mais ça ne marche pas. Le problème est tel que je le vois (avertissement que je pourrais être complètement faux!). Les blocs de code incorporés sont évalués dans les objets Render. Un peu contre intuitivement la page semble contrôler le maître. Ainsi, le rendu de la page maître est appelé avant le rendu des pages. Cela signifie que la page maître voit toujours le contenu dans le contrôle de contenu de la page.

Y at-il un bon moyen de contourner ce problème? (J'ai un peu une solution mais c'est un bidouillage monstrueux! Je ne le posterai pas car je ne veux pas influencer la pensée.)

+0

Aussi, si quelqu'un pouvait penser à un meilleur titre, je serais reconnaissant! :-) –

Répondre

0

Plutôt que de chercher les contrôles qui en résultent, peut-on examiner votre page maître? le contenu du dictionnaire ViewData et travailler sa logique à partir de là?

+0

Malheureusement, cette page maître est utilisée par beaucoup de pages, dont la plupart ont leur propre modèle de vue et logique. Je suppose que je pourrais supposer que la page force le modèle à implémenter une interface et que cela encapsule la logique. Mais je suppose qu'à un certain stade cette hypothèse va être oubliée menant à l'enfer de la maintenance! Ça pourrait bien fonctionner. –

+0

Vous n'êtes pas sûr de pouvoir le faire car votre page maîtresse n'aura accès à aucun objet Modèle de la page 'concret' (en supposant que vous vouliez dire que vous avez forcé le modèle à implémenter une interface?). –

0

Vous pouvez également utiliser javascript pour afficher/masquer les divs sur le client.

+0

Ouais très bon point, malheureusement j'aurais dû dire que je cherchais une solution côté serveur. Attention, si je ne trouve pas de bonne solution, ce sera probablement l'approche finale! –

1

OK, voici une autre idée :). Au lieu de mettre la logique dans votre page maître ...

<% if (ContentPlaceHolder1.HasControls()) {%> 
    <div id="LittleDiv"> 
<% } else { %> 
    <div id="BigDiv"> 
<% } %> 
     some text 
    </div> 

Pourquoi ne pas créer un espace réservé pour cela? par exemple. Vous pouvez ensuite autoriser vos pages concrètes non maîtresses à décider du contenu. Vous pouvez également éviter de vous répéter en déplaçant la logique dans une vue partielle qui pourrait être, disons, paramétrée par vos différentes vues.