2009-06-03 28 views
1

使用的UpdatePanel和RadioButtonLists時,當你改變這些值回發不存在的,我們有一些「奇怪」的問題時,不會觸發。RadioButtonList的預載設置導致的UpdatePanel觸發重新設置爲初始值

我已經成功在於:當在RadioButtonList的值在頁面的預載設置,並且您重新選擇這個初始值出現時追查問題。

我有ASP頁面的完整代碼和下面的代碼隱藏。

ASPX:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="RBLPostBackIssue._Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Untitled Page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
    <div> 
    <asp:Label ID="Label1" runat="server"></asp:Label> 
    <asp:RadioButtonList ID="RadioButtonList1" AutoPostBack="true" OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem>Yes</asp:ListItem> 
     <asp:ListItem>No</asp:ListItem> 
    </asp:RadioButtonList> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:PlaceHolder ID="PlaceHolder1" runat="server"> 
       <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
      </asp:PlaceHolder> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="RadioButtonList1" EventName="SelectedIndexChanged" /> 
     </Triggers> 
    </asp:UpdatePanel> 
    </div> 
    </form> 
</body> 
</html> 

代碼隱藏:

using System; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace RBLPostBackIssue 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_PreLoad(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       switch (new Random().Next(2)) 
       { 
        case 0: 
         Label1.Text = "Initial value set to Yes"; 
         RadioButtonList1.SelectedValue = "Yes"; 
         break; 
        case 1: 
         Label1.Text = "Initial value set to No"; 
         RadioButtonList1.SelectedValue = "No"; 
         break; 
       } 
      } 
     } 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       ShowHideLogic(); 
      } 
     } 

     private void ShowHideLogic() 
     { 
      PlaceHolder1.Visible = RadioButtonList1.SelectedValue.ToLower().Contains("yes"); 
     } 

     protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      ShowHideLogic(); 
     } 
    } 
} 

出現以下情況。

  • 在RadioButtonList隨機設置爲是第一負載或號
  • 你改變在RadioButtonList和文本框的值將顯示/隱藏相應。
  • 您將該值更改回它的原始值,並且根本不發生回發。
  • 無論您多久更改一次值,只有在您不選擇初始值時纔會發生回傳。

PreLoad中初始值的設置來自我們不希望更改的遺留代碼。任何改變都需要大量的測試,並重新部署到大量的其他項目中。

我發現的唯一的解決方案是不使用的RadioButtonList的觸發器,但把它在UpdatePanel內。 Whislt在某些情況下這是一個解決方案,但它並不理想,因爲UI不會允許這樣做。

我想我的問題是,有其他人有這個問題,你知道另一種解決方案呢,還是我只是愚蠢和錯過了一些東西明顯?

回答

3

這是下降到ASP.Net如何呈現單選按鈕列表中的HTML。如果您在第一次加載頁面時查看頁面的源,則最初選擇的<input>元素將具有checked="checked"屬性。最初未選中的<input>元素將改爲具有onclick="javascript:setTimeout('__doPostBack...')"屬性。

因此,只有當您更改所選項目時纔會發生回傳,這足夠公平。

但是,當您使用UpdatePanel時,整個頁面不會在回發時重新呈現,而只是更新面板的內容。因此,如果最初選擇了「是」,則單擊「否」將回發並且文本框將被刪除。但單選按鈕的HTML並沒有改變,所以現在單擊Yes不會回發,因爲沒有javascript來執行此操作。

您可以通過將單選按鈕列表放置在與PlaceHolder相同的UpdatePanel中,或將單選按鈕列表放置在其自己的UpdatePanel中來解決所有這些問題。這將確保呈現單選按鈕的HTML將在每次回發後更新,並且事情將按預期工作。

+0

我不敢相信我沒有想到只是將RadioButtonList放在它自己的更新面板中,而不是將它封裝在我正在使用的版本中。謝謝!! – 2009-06-03 12:43:33