36

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

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

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

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

4

2 に答える 2

53

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

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

編集:元の投稿で編集する回答:

<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 の場合にのみユーザー コントロールが発行 (およびロード) されます。

于 2013-05-29T08:37:47.123 に答える
1

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

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

if(something)
    MyUserControl.SomeSettings = ...

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

編集:

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

于 2013-05-29T08:46:01.633 に答える