需要動態載入使用者控制項,且是透過使用者觸發後再去決定載入何者,假設頁面呈現如下:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
<ContentTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<br />
<asp:Button ID="btUpdate" runat="server" Text="Update" OnClick="btUpdate_Click" />
<asp:Button ID="btNext" runat="server" OnClick="btNext_Click" Text="Next" />
<asp:Button ID="btBack" runat="server" OnClick="btBack_Click" Text="Back" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
程式碼為:
c1.ascx 與 c2.ascx都內含一個TextBox控制項,ID皆為TextBox1。以此作法在第一次載入頁面時,c1.ascx載入的TextBox控制項輸入內容後,按下 Update 按鈕(觸發Postback)之後,其內容會自動被保留。然後按下 Next 按鈕,載入c2.ascx發現c1:TextBox1的內容直接帶到c2中的TextBox1中(原因是ID相同);再者,此時按下Update按鈕後,c2:TextBox1的內容就會消失,再輸入一次內容,然後再按Update按鈕,結果內容會被保留。c2.ascx第一次載入時無法自動儲存狀態,按下Back按鈕回到c1.ascx也是同樣情形。所以動態更換控制項後,第一次postback無法自動儲存狀態。於是天真的改了程式碼:
此修改主要是在載入新的控制項之後,重新PostBack一次;因為一時間找不到應該怎麼做才適合,所以用此方式暫時處理。(還有一個問題是兩個UserControl內的子控制項若有相同ID就會發生自動帶值的問題,在開發上是方便也是困擾。)
搜尋了一下文章,原來是沒有給UserControl的ID值,才會有如此情形(~.~)。所以改了最初的原始碼18-22行如下:
這樣就解決了。參考以下連結:
wljcan.cnblogs.com/archive/2004/06/14/15604.html
www.cnblogs.com/hjf1223/archive/2006/06/20/430475.html