0

私はこの非常に単純化されたコード ブロックを使用しています。

<% if (MyCondition())
{ %>
<myUsedControl/>
<% }
else
{ %>
<myUnusedControl/>
<% } %>

私のascxファイルで。ASP.Net がこのページを読み取るときに、MyCondition() が true を返した場合、else 句にあるものはすべて完全に無視されると思いました。これは当てはまりません。ブラウザがページを表示するときに myUnusedControl が適切に非表示になっているにもかかわらず、myUnusedControl の PageLoad および OnPreRendered イベントは、ページをロードするときにまだ発生しています。

どうしてこれなの?ページがレンダリングされるときに ascx または aspx のチャンクが完全に無視されるようにするにはどうすればよいですか?

御時間ありがとうございます。

4

3 に答える 3

0

Page OnInit の条件 (LoadControl) に基づいてコントロールを動的にロードし、必要なメソッドでそのコントロール変数を使用します。

public class MyClass { MyUserControl _controlVariable ;

protected override void OnInit(EventArgs e)
{
     if (MyCondition())  
     { 
          _controlVariable  = Loadcontrol("control1.ascx");
     }

     else  
     { 
         _controlVariable  = Loadcontrol("control2.ascx");

     }
  }
}
于 2012-05-24T20:32:45.350 に答える
0

MyCondition()ASP.NETは、サブスクライブされた PreRender イベントの実行に依存していないと推測できません。メソッドには、2 回実行してはならない副作用がある可能性もあるため、できるだけ遅く 1 回だけ呼び出す必要があります。イベント サイクルですべてのコントロールを最新の状態に保つ必要もあります。あるコンポーネントがまだ初期化されておらず、他のコンポーネントがすでにポストバック イベントをトリガーしている場合、ページ内のさまざまなコンポーネントはどのように機能する必要がありますか?

やや不自然な例では:

Boolean _condition;
Boolean MyCondition() {
    return _condition;
}

void MyContrivedPreRender(Object sender, EventArgs e) {
    _condition = true;
}

<% if(MyCondition()) { %>
    <asp:Literal runat="server" Text="Hello world?"
                 OnPreRender="MyContrivedPreRender" />
<% } %>

于 2012-05-24T19:36:00.473 に答える
0

いつでも 2 番目のコントロールを使用して複製ページを作成し、if 条件分岐をパイプラインの前に置いて、ロードされるページを制御できます。

この例では、コントロールを ascx/aspx ページ マークアップに登録するのではなく、常にコード ビハインドのコントロール コレクションに手動で追加し、その周りで分岐を行うことができます。

于 2012-05-24T20:04:51.433 に答える