asp.net - 中继器内 UpdatePanel 内的 RadioButtonList,我可以吗?

标签 asp.net updatepanel nested repeater radiobuttonlist

我在 ItemTemplate 中有一个带有 RadioButtonList 的中继器,但是当 RadioButtonList.OnSelectedIndexChanged 事件触发时,它会生成一个完整的回发。我在下面的代码中做错了什么?如何让 OnSelectedIndexChanged 生成异步回发?

<asp:UpdatePanel runat="server" ID="UpdatePanel2">
    <ContentTemplate>
        <asp:Repeater ID="Repeater1" runat="server" DataSourceID="sqlOptions">
            <ItemTemplate>
                <asp:UpdatePanel runat="server" ID="pnlA">
                    <ContentTemplate>
                        <strong>
                            <%# Eval("Name") %></strong><br />
                        <asp:RadioButtonList ID="RadioButtonList1" 
                             DataSourceID="sqlOptionValues" runat="server"
                             DataTextField="id" DataValueField="Id" AutoPostBack="true" 
                             OnSelectedIndexChanged="LoadPrice"
                             ValidationGroup="options" />
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
                             ForeColor="Red" runat="server" 
                             ControlToValidate="RadioButtonList1" 
                             ErrorMessage="Required Field" 
                             ValidationGroup="options" />
                        <asp:SqlDataSource ID="sqlOptionValues" runat="server" 
                             ConnectionString="<%$ ConnectionStrings:
                                 ConnectionString6 %>"
                             SelectCommand='<%# "SELECT DISTINCT OptionValue.Name,
                                 OptionValue.Id FROM CombinationDetail 
                                 INNER JOIN OptionValue 
                                 ON CombinationDetail.OptionValueId = OptionValue.Id 
                                 WHERE (OptionValue.OptionId =" + 
                                 Eval("Id") + ")" %>'>
                        </asp:SqlDataSource>
                        <br />
                    </ContentTemplate>
                </asp:UpdatePanel>
            </ItemTemplate>
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

非常感谢您的帮助:)

最佳答案

这是一个真实世界的用例。我有一个页面,其中包含中继器、其他 Accordion 内的 Ajax Accordion 、其他更新面板内的更新面板,您可以说出它的名字。该页面运行良好,除非我想用我的 RadioButtonList (RBL) 更新 Accordion 面板之一。即使在更新面板中使用 RBL,它也会导致整个页面的回发。我尝试了一切。当我注意到我的按钮可以正常工作时,我终于意识到这不是我。我认为这一定是框架或 Ajax Control Toolkit 中的错误。我确实发现人们在整个网络( http://blog.smarx.com/posts/the-case-of-the-radiobuttonlist-half-trigger.aspx )上都引用了这个链接,但是这个 2007 年的链接现在已经死了,可能不再适用,所以这没有帮助。

我最终做的是使用有效的方法 - 提交按钮。我所做的只是向 RBL 添加一个 onclick 属性以调用隐藏按钮。现在您不想将按钮设置为 Visible=false,因为这样按钮就不会出现在生成的标记中。相反,将按钮的样式设置为 display:none;所以没有人会看到这个黑客,因为是的,这就是这个解决方法 - 这是一个黑客,但简单且与您期望的一样有效。不要忘记从 RBL 中删除 Autopostback="True"。

警告:因为我在 onclick 事件中使用了一个被黑的按钮,所以用户可以在 RBL 区域中单击,但实际上并没有选择一个项目。发生这种情况时,我们的 onclick 会触发 AsyncPostBack 并且将处理代码隐藏逻辑,因此请记住这一点。为了让您了解我的意思:所有 Page_Load() 事件都将被调用,但 rbl_Questions_SelectedIndexChanged() 如果它们碰巧在 RBL 区域中单击而没有实际选择项目,则不会调用。出于我的目的,这不会导致我的逻辑出现问题并且对用户没有影响。

这是代码:

.Aspx 页面中的某处:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">  
    <ContentTemplate>

        <asp:RadioButtonList ID="rbl_Questions" runat="server"
            OnSelectedIndexChanged="rbl_Questions_SelectedIndexChanged">
        </asp:RadioButtonList>

        <asp:Button ID="btn_rbl_Questions" runat="server" style="display:none;"/>

        <asp:Label ID="lbl_Result" runat="server" Text="" Visible="false">
        </asp:Label>
    </ContentTemplate>  
</asp:UpdatePanel>

在 Page_Load() 事件中:
protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack == false)
    {
        //Instead of using the AutoPostback of the RBL, use this instead.
        rbl_Questions.Attributes.Add("onclick",
            "document.getElementById('"
            + btn_rbl_Questions.ClientID
            + "').click();");
        //Bind your RBL to a DataSource, add items programmatically,
        //  or add them in the aspx markup.
    }
}

在 rbl_Questions_SelectedIndexChanged() 事件中:
protected void rbl_Questions_SelectedIndexChanged(object sender, EventArgs e)
{
    //Your code here.
    //My code unhid the lbl_Result control and set its text value.
}

2011 年 5 月 24 日更新

不再需要上面的“hack”(我把它留在上面,因为这被作者标记为答案)。由于这个 SO Answer,我找到了最好的方法来做到这一点:
Updatepanel gives full postback instead of asyncpostback

现在代码更简单了,只需删除我在 Page_Load() 方法中放置的内容并删除我在 Aspx 页面中使用的 Button 并将 ClientIDMode="AutoID"和 AutoPostBack="True"添加到您希望 UpdatePanel 捕获的控件中.

.Aspx 页面中的某处:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">  
    <ContentTemplate>

        <asp:RadioButtonList ID="rbl_Questions" runat="server"
            ClientIDMode="AutoID" AutoPostBack="true"
            OnSelectedIndexChanged="rbl_Questions_SelectedIndexChanged">
        </asp:RadioButtonList>

        <asp:Label ID="lbl_Result" runat="server" Text="" Visible="false">
        </asp:Label>
    </ContentTemplate>  
</asp:UpdatePanel>

MS 将 .net 4.0 中 ClientID 的生成方式从“AutoID”更改为“Predictable”,我猜 ScriptManager 或 UpdatePanel 没有正确更新以使用它。我找不到关于为什么它在任何地方或者它是否被设计留下这种方式的文档。

关于asp.net - 中继器内 UpdatePanel 内的 RadioButtonList,我可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5904011/

相关文章:

python - 如何将关联的相邻 Pandas 数据框数据导出到字典中?

c# - 截断 RadGrid 列中的文本

asp.net - 仅具有共享函数的类 - 为什么它不好?

c# - 获取动态创建的图像按钮 ID (C#)

c# - 在没有 PostBack 的情况下更改标签文本(使用更新面板)

c# - 在处理循环期间更新 ASP.NET UpdatePanel

c# - 使用 updatepanel 和母版页提交表单后设置 javascript ScrollTo

javascript - 为什么当我尝试从 javascript 中的嵌套数组访问元素时,出现未定义的情况?

C# GridView : Setting Up AutoGenerateEditButton

java - 如何将值映射到嵌套 TreeMap