2009-01-29 27 views
1

我有一個具有多個更新面板多的UpdatePanel和國家


在頁面加載的用戶控件,我動態地加載一個子用戶控件拖到佔位符(我每次做這個,不要檢查回傳)

我想能夠保持狀態用戶在Child用戶控件中所做的更改。 (子用戶控件包含html控件以及asp.net控件和其他自定義控件)。

只要點擊導致回發的按鈕A或B,子用戶控件就會丟失狀態。 UpdatePanels的模式已設置爲條件。

在的onPageLoad,

  1. 我打開一個子控件的PlaceHolderA
  2. 這個孩子的控制有很多JS的另一用戶控制。用戶可能會對子控件進行更改。
  3. 當他們點擊作爲父控件一部分的按鈕A時,OnPageLoad會導致子控件重新加載,導致它失去用戶所做的客戶端更改。

我想阻止這種情況發生。

這裏的ASPX頁面

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

回答

0

塊引用 //代碼在你的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> 

塊引用 //代碼在你的web服務類

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

從我的頁面的腳本我會對我的web服務做Ajax,而回調EndHelloWorld你可以做任何事情而不會丟失狀態。

希望它有幫助... 親切的問候。 Josema。

0

它看起來像你需要刪除嵌套的UpdatePanels。在這樣的結構:

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

全部的更新面板會隨時更新,即使孩子的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> 
1

當動態添加控件則需要重新每次加載頁面時添加它們。我必須解決類似的困難,我以兩種方式做到這一點。在添加動態字段的同時,我實際上會在用戶單擊以填充或添加它之前向頁面添加一個隱藏控件。通過創建這種佔位符,系統開始正確處理viewstate,並保留用戶更改。我聽到你提到的第二個問題是,chich更新面板更新可能存在問題。讓他們設置爲有條件地編寫代碼是很好的 - 如果你需要從代碼中獲取更多信息,你也可以觸發其他的更新。這只是更新面板#.update()

或者你也可以包裝所有的更新面板在另一個面板,但我建議不要這樣做,因爲它浪費資源。

1

看起來你失去了動態添加的子控件的ViewState。

這是因爲您在頁面生命週期中添加太遲:ViewState在Page.Load事件之前加載。

嘗試在Page.Init中添加您的子控件。