3

問題

Web フォームがあり、一部のパネルを表示または非表示にしたいと考えています。「パネル」と言うとき、Panelコントロールを意味するのではなく、html 内の単なるペイン (通常は DIV で表される) を意味します。

このパネルを好きなように表示したり隠したりしたいのですが... 制限がないということは、必ずしも 1 つのペインだけが表示される必要があるわけではなく、2 つ、3 つ、または 4 つも表示される可能性があることを意味します。

通常、私はこれを次のように達成しました:

<div id="mypane1" runat="server">
  ...
</div>
<div id="mypane2" runat="server">
  ...
</div>
<div id="mypane3" runat="server">
  ...
</div>

この:

this.mypane1.Visible = true;
this.mypane2.Visible = false;
this.mypane3.Visible = true;

残念ながら、これらのパネルにはコントロールが含まれており、その一部は最初から表示されていません (最初の Web フォームの読み込みのため、何も起こらないPostBack場合)。これにより、ViewState読み込みの問題が発生します。

ViewStateの読み込みについて

ViewStateもちろん、多くの人が私のこれらの問題について尋ねるでしょう。簡単に言うと、ViewStateローディング エラーを管理するのは簡単ではありませんが、最終的に次のことを理解できました。

これがあるとしましょう:

<!-- In .aspx -->
<div id="mypane1" runat="server">
  ...
  <asp:Literal ID="..." runat="server" ...></asp:Literal>
  <asp:TextBox ID="..." runat="server" ...></asp:TextBox>
  ...
</div>
<div id="mypane2" runat="server">
  ...
  <asp:LinkButton ID="lb1" OnClick="lb1_Click" runat="server" ...></asp:LinkButton>
  <asp:LinkButton ID="lb2" OnClick="lb2_Click" runat="server" ...></asp:LinkButton>
  <asp:LinkButton ID="lb3" OnClick="lb3_Click" runat="server" ...></asp:LinkButton>
  ...
</div>
<div id="mypane3" runat="server">
  ...
  <asp:TextBox ID="..." runat="server" ...></asp:TextBox>
  <asp:LinkButton ID="lb4" OnClick="lb4_Click" runat="server" ...></asp:LinkButton>
  <asp:TextBox ID="..." runat="server" ...></asp:TextBox>
  ...
</div>

// In .aspx.cs
protected void Page_Load(...) {
  if (!this.IsPostBack) {
    this.mypane1.Visible = true;
    this.mypane2.Visible = false;
    this.mypane3.Visible = true;
  }
}

/// ... In the page many happens and the panes are shown and hidden ... ///

// Event Handlers
protected void lb1_Click(object sender, EventArgs e) {
  ...
}
protected void lb2_Click(object sender, EventArgs e) {
  ...
}
protected void lb3_Click(object sender, EventArgs e) {
  ...
}
protected void lb4_Click(object sender, EventArgs e) {
  ...
}

さて問題は以下。

  • 最初はペイン2は表示されていません。

  • いくつかの操作の後、pane2 が表示され、そのコントロールも表示されます。

  • ユーザーが lb1 をクリック -->ViewState error

同じことが、pane2 のコントロールに関連付けられたすべてのイベントで発生することに注意してください。lb4は押されていますが、問題ありません。

問題は、最初の階層がペイン 1 と 3 のコントロールによって表されることです。最初の階層の一部ではないコントロールによってイベントが発生した場合、ViewState一貫性がないことがわかります (私が行動するためHtmlControls、通常ServerControlsはよりインテリジェントであり、コントロールがより適切に ViewState を管理できるため)それらの中に追加されます)。

実現可能なソリューション

パネルを非表示および表示するには、次のように簡単に実行できることに注意してください。

this.mypane2.Attributes.Add("display", "none");

これは、次の 2 つの理由からやりたくないことです。

  • ペインを Html としてレンダリングしないようにします。

  • サーバー コントロールを使用したいと思います。

リクエスト

パネル管理を管理するために Web コントロールを使用する必要がありますHtmlControl。コントロール階層が正しくロードされていないため、s を使用できません。

ビュー コントロールを試しMultiViewてみましたが、アクティブなビューを 1 つしか使用できません。どのようにできるのか?

注: 問題にあまり焦点を合わせないでください。ViewStateこれは、何が起こるかを知らせる良い説明です。私の唯一の関心は、サーバー コントロールを使用してペインを自由に非表示および表示する方法を見つけることです。

ありがとうございました

4

3 に答える 3

2

パネルの可視性を false に設定すると、子が ViewState に追加されないか、何らかの方法で干渉すると想定しています。あれは正しいですか?

それを考えると、.Netレンダリングエンジンに関する限りコントロールをそこに置きたいが、エンドユーザーからは隠したい場合は、css ieを使用してそれらを表示および非表示にしようとすることができます

見せる

pnlDemo.Attributes.Add("style", "display:block");

隠れる

pnlDemo.Attributes.Add("style", "display:none");

ViewState の目的で ASP.Net コントロールが必要な状況がありましたが、表示されませんでした。適切な時点で、JQuery を使用してそれらを示します。この方法はそのシナリオで機能するため、あなたのシナリオでも機能する可能性があります。

于 2012-01-07T16:05:42.950 に答える
1

ViewStateModeByIdAttributeを使用してみましたか?

ViewStateModeByIdAttribute クラスは、ID によるビューステートの読み込みを必要とするコントロールを指定するために使用されます。既定のビューステート読み込み動作は、ASP.NET がページのコントロール ツリー内のインデックスによってコントロールのビューステート情報を読み込むことです。ビューステート情報をロードする前にページ コントロール ツリーでコントロールを検索する必要があるため、ビューステート情報を ID でロードするとパフォーマンスが低下します。

于 2012-01-08T03:29:32.173 に答える