代码之家  ›  专栏  ›  技术社区  ›  Robin Day

当设置回初始值时,预加载中设置的RadioButtonList会导致UpdatePanel触发器不触发

  •  1
  • Robin Day  · 技术社区  · 16 年前

    我们在使用UpdatePanels和RadioButtonList时遇到了一些“奇怪”的问题,因为当您更改值时,回发没有发生。

    我已经设法追踪到了这个问题,因为当RadioButtonList的值在页面的预加载中设置,并且您正在重新选择这个初始值时,就会发生这个问题。

    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使用触发器,而是将其放在UpdatePanel中。尽管在某些情况下这是一个解决方案,但它并不理想,因为UI并不总是允许这样做。

    我想我的问题是,还有其他人有这个问题吗?你知道解决这个问题的另一种方法吗?还是我只是太傻了,错过了一些显而易见的东西?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Graham Clark    16 年前

    <input> 最初选定的元素将具有 checked="checked" 属性这个 <输入> 最初未选择的元素将具有 onclick="javascript:setTimeout('__doPostBack...')" 属性

    因此,只有当您更改所选项目时,才会发生回发,这很公平。

    但是,当您使用UpdatePanel时,整个页面不会在回发时重新呈现,而只是更新面板的内容。因此,如果最初选择“是”,单击“否”将发回,文本框将被删除。但是单选按钮的HTML没有改变,所以单击Yes now不会发回,因为没有javascript可以这样做。

    您可以通过将单选按钮列表放置在与占位符相同的UpdatePanel中,或者将单选按钮列表放置在其自己的UpdatePanel中来修复所有这些问题。这将确保呈现单选按钮的HTML在每次回发后都会更新,并且一切都会按预期进行。

    推荐文章