1

複数の更新パネルを持つユーザー コントロールがあります


ページの読み込み時に、子ユーザー コントロールを PlaceHolder に動的に読み込みます (毎回これを行い、ポストバックをチェックしません)。

ユーザーが子ユーザー コントロールで行った変更の状態を維持できるようにしたいと考えています。(子ユーザー コントロールには、asp.net コントロールおよびその他のカスタム コントロールと共に html コントロールがあります)。

ポストバックの原因となるボタン A または B をクリックすると、子ユーザー コントロールの状態が失われます。UpdatePanels のモードは条件付きに設定されています。

OnPageLoad では、

  1. PlaceHolderA に子コントロールをロードします
  2. この子コントロールには、多くの JS を持つ別のユーザー コントロールがあります。ユーザーは子コントロールを変更できる可能性があります。
  3. 親コントロールの一部であるボタン A をクリックすると、OnPageLoad によって子コントロールがリロードされ、ユーザーが行ったクライアント側の変更が失われます。

これを未然に防ぎたいと思います。

ASPX ページの HTML 構造は次のとおりです。

<UpdatePanel1>
<UpdatePanelChild1>
    <Button A>
    <Button B>
</UpdatePanelChild1>
<UpdatePanelChild2>
    <PlaceHolderA>
</UpdatePanelChild2>    

4

5 に答える 5

1

コントロールを動的に追加する場合は、ページが読み込まれるたびにコントロールを再追加する必要があります。私は同様の困難に取り組む必要がありました、そして私はこれを2つの方法で行います。動的フィールドがその場で追加される場合、ユーザーがクリックしてページに入力するか、自分で追加する前に、実際に非表示のコントロールをページに追加します。この種のプレースホルダーを作成することにより、システムはビューステートの処理を正しく開始するタイミングを持ち、これによりユーザーの変更が保持されます。あなたが言及していると聞いた2番目の問題は、chich更新パネルの更新に問題がある可能性があるということです。コードを条件付きで設定するのは問題ありません。コードから必要な場合は、背後で他のパネルで更新をトリガーすることもできます。updatepanel#.update()だけです

または、すべての更新パネルを別のパネルでラップすることもできますが、リソースを浪費するため、これはお勧めしません。

于 2009-02-05T17:09:42.917 に答える
0

Blockquote//Asp.Netコードのコード

<form runat="server" id="form1">
           <asp:ScriptManager id="ScriptManager1" runat="server" >
                 <Services>
                    <asp:ServiceReference Path="/WebServices/MyService.asmx"/>
                 </Services>
            </asp:ScriptManager> 
        </form>    
            <script language="javascript" type="text/javascript">
                //call with namespace "WebSite" included 
                WebSite.WebServices.HelloWorld(EndHelloWorld);


                function EndHelloWorld()
                {
                    //do whatever
                }
            </script>    
    </form>

Blockquote//Webサービスクラスのコード

[ScriptService]
    public class MyService : System.Web.Services.WebService
    {
        [WebMethod]
        public void HelloWorld()
        {
           return "Hello world";
        }            
    }

私のページのスクリプトから、Webサービスに対してAjaxを実行し、コールバックEndHelloWorldは、状態を失うことなく何でも実行できます。

お役に立てば幸いです...よろしくお願いします。ホセマ。

于 2009-01-29T16:10:38.687 に答える
0

ネストされたUpdatePanelを削除する必要があるようです。このような構造では:

<ParentUpdatePanel>
  <ChildUpdatePanel1 />
  <ChildUpdatePanel2 />
</ParentUpdatePanel />

親が実際に更新しているので、子のUpdatePanelが条件付きに設定されている場合でも、すべての更新パネルは常に更新されます。したがって、子の1つでのポストバックイベントにより、親が更新されます。

このタイプのパターンを使用することは一般的に悪いことです...あるUpdatePanelからのイベントが別のUpdatePanelで更新を引き起こす必要がある場合は、次のようにする必要があります。

<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:Button ID="buttonA" runat="server" />
    <asp:Button ID="buttonB" runat="server" />
  </ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="up2" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:Placeholder ID="ph" runat="server" />
  </ContentTemplate>
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="buttonB" EventName="Click" />
  </Triggers>
</asp:UpdatePanel>
于 2009-01-29T16:16:45.073 に答える
0

パネルを更新する代わりに、コントロール内のフォームrunatサーバーでScriptManagerを使用できます。

このように、あなたはポストバックを持っていません。

ここに良いリファレンスがあります:http ://www.asp.net/Ajax/Documentation/Live/overview/ScriptManagerOverview.aspx

ご挨拶。ホセマ。 http://www.learning-workshop.com

于 2009-01-29T15:49:03.613 に答える