2013-05-29 9 views
22

ich einen Code haben, der im Wesentlichen wie folgt aussieht:Wenn Aussagen in aspx-Dateien

<div> 
    <% if(Something) { %> 
     <div id="someUniqueMarkup"> 
      This markup should not be output if Something==true. 

      <units:MyUserControl runat="server"/> 
     </div> 
    <% } 
    else { %> 
     <units:MyUserControl runat="server" /> 
    <% } %> 
</div> 

Je nach Something, einer von ihnen verborgen ist, und das ist in Ordnung. Aber wenn ich Breakpoints im Benutzersteuerelement setze, merke ich, dass es zweimal geladen wird (einmal für jede der oben genannten Steuerelemente) und seine Logik wird zweimal ausgeführt. Ich könnte natürlich dies mit Platzhaltern oder Multiviews steuern, aber das gleiche scheint zu gelten - OnLoad/Page_Load usw. wird einmal für jedes Steuerelement ausgeführt, das sich tatsächlich auf der Seite befindet.

EDIT: Der Grund, warum im Aus-/diese versteckt, weil ich einige Markup enthalten muß um die Kontrolle, wenn Something == true. Ich könnte das "einzigartige Markup" selbst in if-else vor und nach dem Steuerelement einpacken, aber das scheint nur schmutzig zu sein für etwas, das wirklich so einfach sein sollte, wie ich es mir oben vorgestellt habe. Das Benutzersteuerelement selbst sollte in beiden Szenarien identisch sein. Entschuldigung für die verwirrende Eigenschaft, die es hatte.

Ist es nur ich oder ist das nur eine wirklich unintuitive Schnittstelle? Und ist es tatsächlich möglich, ein Benutzersteuerelement überhaupt nicht zu laden/auszuführen, solange es sich auf der Seite befindet?

+0

Es sind nur Sie, denke ich. –

+0

Warum nicht Codebehind verwenden? Ihre Steuerung ist serverseitig. Wenn Sie also den ID-Parameter hinzufügen, können Sie Ihre Einstellung festlegen. und benutze es nur einmal, wie @Kenneth in seiner Antwort erwähnt. – sasjaq

+0

Ja, es ist wirklich nicht intuitiv. Aber das gilt auch für WebForms! – theyetiman

Antwort

34

Da Sie zwei Steuerelemente auf der Seite haben, wird es beide rendern. Das von Ihnen erstellte if-check bestimmt nur, ob es in der Ausgabe enthalten ist. Der einfachste Weg, dies zu verhindern, ist der Code wie folgt zu ändern:

<div> 
    <units:MyUserControl runat="server" SomeSetting="<%= Something %>" /> 
</div> 

EDIT: in der ursprünglichen Nachricht Antwort zu bearbeiten:

Sie
<div> 
    <% if(Something) { %> 
     <div id="someUniqueMarkup"> 
      This markup should not be output if Something==true. 

      <asp:placeholder id="phItemInDiv" runat="server" /> 
     </div> 
    <% } 
    else { %> 
     <asp:placeholder id="phItemOutsideDiv" runat="server" /> 
    <% } %> 
</div> 



MyUserControl ctrl = (MyUserControl)LoadControl("/pathtousercontrol.ascx") 
if (something){  
    phItemInDiv.Controls.Add(ctrl); 
} 
else{ 
    phItemOutsideDiv.Controls.Add(ctrl); 
} 

haben diese Weise nur die Benutzersteuerung emittiert (und geladen) wenn Something ist wahr

+0

Ich weiß, aber es gibt eine Menge Dinge, die nicht um das Benutzersteuerelement angezeigt werden sollen. Wird den ursprünglichen Beitrag aktualisieren, um dies zu verdeutlichen. –

+0

Einfach, aber effektiv, ich mag es –

+0

Siehe Änderungen jetzt. Das "SomeSetting" -Attribut war nicht wirklich mein Punkt, es wurde nur hinzugefügt, um einen größeren Unterschied zwischen ihnen zu machen. : - \ –

1

Der beste Weg, meiner Meinung nach, ist Ihre Benutzerkontrolle einmal in der ASPX zu deklarieren.

In dem Code hinter, auf Pageload, die Logik anwenden sehen Sie fit:

if(something) 
    MyUserControl.SomeSettings = ... 

Wenn es ein Problem in der Chronologie ist, in PreLoad die obige Logik tun, da es vor dem Laden der Seite des Feuer wird Seite und alle zugehörigen Benutzersteuerelemente.

EDIT:

können Sie zwei unterschiedliche IDs setzen auf die Bedienelemente mit Enabled = false. Setzen Sie in PageLoad die Option Enabled entsprechend der gewünschten Logik auf eine davon.

+0

Siehe bearbeiten, entfernt ich die "SomeSetting" -Eigenschaft, da es nicht wirklich Teil des Punktes war ich war versuchen zu machen. –