it-swarm.com.de

If-Anweisungen in ASPX-Dateien

Ich habe einen Code, der im Wesentlichen so aussieht:

<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>

Abhängig von Something ist einer von ihnen ausgeblendet, und das ist in Ordnung. Wenn ich jedoch Haltepunkte im Benutzersteuerelement festlege, wird es zweimal geladen (einmal für jedes der obigen Steuerelemente) und die gesamte Logik wird zweimal ausgeführt. Ich könnte dies natürlich mit Platzhaltern oder Multiviews steuern, aber das gleiche scheint zuzutreffen - OnLoad/Page_Load etc wird einmal für jedes Steuerelement ausgeführt, das sich tatsächlich auf der Seite befindet.

EDIT: Der Grund, warum ich dies ein-/ausblende, ist, dass ich ein Markup um das Steuerelement einfügen muss, wenn Something == true. Ich könnte das "einzigartige Markup" selbst in if-else vor und nach der Kontrolle einwickeln, aber das scheint nur schmutzig für etwas, das wirklich so einfach sein sollte, wie ich es mir oben vorgestellt habe. Das Benutzersteuerelement selbst sollte in beiden Szenarien genau gleich sein, entschuldigen Sie die verwirrende Eigenschaft.

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

27
Arve Systad

Da Sie zwei Steuerelemente auf der Seite haben, werden beide gerendert. Der von Ihnen erstellte If-Check bestimmt nur, ob er in der Ausgabe enthalten ist. Der einfachste Weg, dies zu verhindern, besteht darin, den Code folgendermaßen zu ändern:

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

EDIT : Antwort zum Bearbeiten im Originalbeitrag:

<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);
}

Auf diese Weise wird das Benutzersteuerelement nur ausgegeben (und geladen), wenn Something wahr ist

43
Kenneth

Meiner Meinung nach ist es am besten, Ihre Benutzersteuerung einmal in ASPX zu deklarieren.

Wenden Sie im Code dahinter auf PageLoad die Logik an, die Sie für richtig halten:

if(something)
    MyUserControl.SomeSettings = ...

Wenn es ein Problem in der Chronologie gibt, führen Sie die obige Logik in PreLoad aus, da sie vor dem Laden der Seite und aller zugehörigen Benutzersteuerelemente ausgelöst wird.

EDIT:

Mit Enabled = false können Sie den Benutzersteuerelementen zwei verschiedene IDs zuweisen. Setzen Sie in Page Load die Option Aktiviert auf eine von ihnen, basierend auf der gewünschten Logik.

1
SiN