web-dev-qa-db-ja.com

aspxファイルのifステートメント

基本的に次のようなコードがいくつかあります。

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

Somethingに応じて、そのうちの1つが非表示になり、それで問題ありません。しかし、ユーザーコントロールにブレークポイントを設定すると、(上記の各コントロールに対して1回ずつ)2回読み込まれ、すべてのロジックが2回実行されていることに気付きます。もちろん、プレースホルダーまたはマルチビューでこれを制御できますが、同じことが当てはまるようです-OnLoad/Page_Load etcは、実際にページ上にある各コントロールに対して1回実行されます。

編集:これを表示/非表示にする理由は、Something == true。コントロールの前後にif-elseで「一意のマークアップ」自体をラップすることもできますが、それは、上で想像したほど単純なものでなければならないために汚いようです。ユーザーコントロール自体は、両方のシナリオでまったく同じである必要がありますが、紛らわしいプロパティがありました。

それは私だけですか、これは本当に直感的でないインターフェースですか?また、ページ上にある限り、ユーザーコントロールをまったくロード/実行しないことは実際に可能ですか?

27
Arve Systad

ページ上に2つのコントロールがあるため、両方が表示されます。作成するif-checkは、それが出力に含まれるかどうかのみを決定します。これを防ぐ最も簡単な方法は、次のようにコードを変更することです。

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

[〜#〜] edit [〜#〜]:元の投稿で編集する回答:

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

この方法では、Somethingがtrueの場合にのみユーザーコントロールが発行(およびロード)されます。

43
Kenneth

私の意見では、最善の方法はASPXでユーザーコントロールを一度宣言することです。

コードビハインドのPageLoadで、適切と思われるロジックを適用します。

if(something)
    MyUserControl.SomeSettings = ...

年表に問題がある場合は、ページおよびそのすべての関連ユーザーコントロールのページ読み込みの前に起動されるため、PreLoadで上記のロジックを実行します。

編集:

Enabled = falseを使用して、ユーザーコントロールに2つの異なるIDを配置できます。 Page_loadで、必要なロジックに基づいて、Enabledをそれらのいずれかに設定します。

1
SiN