web-dev-qa-db-fra.com

Instructions if dans les fichiers aspx

J'ai du code qui ressemble essentiellement à ceci:

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

Selon Something, l'un d'eux est caché, et c'est très bien. Mais si je fixe des points d'arrêt dans le contrôle utilisateur, je remarque qu'il est chargé deux fois (une fois pour chacun des contrôles ci-dessus) et que toute sa logique est exécutée deux fois. Je pourrais bien sûr contrôler cela avec des espaces réservés ou des vues multiples, mais la même chose semble s'appliquer - OnLoad/Page_Load etc est exécuté une fois pour chaque contrôle qui se trouve réellement sur la page.

EDIT: La raison pour laquelle je montre/cache ceci est parce que je dois inclure un balisage autour du contrôle si Something == true. Je pourrais envelopper le "balisage unique" lui-même dans if-else avant et après le contrôle, mais cela semble juste sale pour quelque chose qui devrait vraiment être aussi simple que je l'ai imaginé ci-dessus. Le contrôle utilisateur lui-même devrait être exactement le même dans les deux scénarios, désolé pour la propriété confuse qu'il avait.

Est-ce juste moi ou est-ce juste une interface vraiment peu intuitive? Et est-il réellement possible de ne pas charger/exécuter un contrôle utilisateur du tout tant qu'il est sur la page?

27
Arve Systad

Étant donné que vous avez deux contrôles sur la page, les deux seront rendus. La vérification if que vous créez détermine uniquement si elle est incluse dans la sortie. Le moyen le plus simple d'éviter cela est de modifier votre code comme ceci:

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

MODIFIER : Répondre à modifier dans le message d'origine:

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

De cette façon, le contrôle utilisateur ne sera émis (et chargé) que si Something est vrai

43
Kenneth

La meilleure façon, à mon avis, est de déclarer une fois votre contrôle utilisateur dans l'ASPX.

Dans le code derrière, sur PageLoad, appliquez la logique que vous jugez appropriée:

if(something)
    MyUserControl.SomeSettings = ...

S'il y a un problème dans la chronologie, effectuez la logique ci-dessus dans PreLoad car il se déclenchera avant le chargement de la page de la page et tous ses contrôles utilisateur associés.

MODIFIER:

Vous pouvez mettre deux ID différents sur les contrôles utilisateur avec Enabled = false. Dans la version d'envoi, définissez Activé sur l'un d'eux en fonction de la logique souhaitée.

1
SiN