6

我有一个将 AutoPostBack 设置为 true 的 ASP.Net RadioButtonList 控件。我还有一个 OnSelectedIndexChanged 函数,只要用户更改选择,就会调用该函数。最后,要求用户提供这个控件所请求的信息,所以当用户到达页面时,我有一个默认选择——

<asp:RadioButtonList ID="rblHighestDegree" runat="server" AutoPostBack="true"
        onselectedindexchanged="rblHighestDegree_SelectedIndexChanged">
   <asp:listitem Runat="server" Text="Master's Degree" Selected="True" />
   <asp:listitem Runat="server" Text="Doctorate" />
</asp:RadioButtonList>

在上面的代码示例中,当用户从默认选择(例如,“硕士学位”)切换到不同的选项(例如,“博士”)时,就会触发 SelectedIndexChanged 事件。然后,如果用户改变主意,并随后选择了原来的默认选项,则 SelectedIndexChanged 事件将再次被触发。这完全按预期和预期工作。

根据上面的选择,我在代码隐藏中启用或禁用了第二个控件...

<asp:ScriptManager ID="scriptmanager1" runat="server" />
<asp:UpdatePanel ID="updatepanel1" runat="server">
<ContentTemplate>
<asp:RadioButtonList ID="rdlYearsOfStudy" runat="server" Enabled="false">
<asp:listitem Runat="server" Text="Less than 3 years" />
<asp:listitem Runat="server" Text="3 - 4 years" />
<asp:listitem Runat="server" Text="5 - 6 years" />
 </asp:RadioButtonList>
</ContentTemplate>
<Triggers>
  <asp:AsyncPostBackTrigger ControlID="rblHighestDegree" EventName="SelectedIndexChanged" /> 
</Triggers>
</asp:UpdatePanel>

只有我将第二个控件放在 ASP.Net AJAX UpdatePanel 中以启用异步回发(如上所示)之后,才会出现问题。一旦我这样做了,原来的 RadioButtonList 控件只会在我选择一个 ListItem 时回发,当用户到达页面时默认情况下没有选择该 ListItem。如果用户随后选择原始默认选择,则不会发生回发。

澄清一下,如果我没有在 ASP.Net AJAX UpdatePanel 中放置适用的第二个控件就回发,那么无论用户选择哪个 RadioButtonList ListItem,SelectedIndexChanged 都会起作用。另一方面,在我在 UpdatePanel 中放置一个控件以应用 AsyncPostBackTrigger 后,回发只会发生在非默认 ListItems 的选择中。

可能相关的更多信息是我正在使用 Microsoft Visual Studio 2008 进行编码,并且我使用的 UpdatePanel 控件是 Microsoft AJAX 库(不是 ASP.NET AJAX 控件工具包)的一部分。

我将不胜感激有关如何让 ASP.Net AJAX 工作的任何见解,以便在用户选择 RadioButtonList 中的默认或非默认 ListItems 时触发 SelectedIndexChanged 事件。作为记录,我尝试在 page_load 事件中设置 RadioButtonList 默认选择,但没有帮助。

提前感谢您的任何帮助!

4

5 回答 5

5

我遇到了同样的问题,发现生成的 HTML 在默认选择中没有点击处理程序。列表中的其他单选按钮都有单击处理程序来调用 __doPostBack。所以我添加了这个 jQuery:

$("#rbl input[checked]").click(function (e)
{
    var id = e.target.id.replace('_', '$');
    setTimeout(function () { __doPostBack(id, ""); }, 0);
});

然而,即使 ajax 调用现在按预期工作,服务器端代码仍然没有执行 selectedIndexChanged 处理程序。

认为这可能是因为服务器知道默认选择是什么,并且看到发布的选择是相同的,因此认为所选索引没有更改,因此没有执行处理程序。

Then I thought that when one of the other radios was selected, the server should have remembered that through the viewstate. 这让我想起了我viewstatemode="Disabled"在单选按钮列表的容器上。所以我设置viewstatemode="Enabled"了单选按钮列表,它现在按预期工作。

于 2012-10-19T16:07:36.417 回答
2

微软表示这是设计使然。他们提供了 2 种变通方法,但两种变通方法都存在可能妨碍实际解决方案的问题。

http://connect.microsoft.com/visualstudio/feedback/details/508710/radiobuttonlist

于 2013-12-17T16:55:01.330 回答
0

我在后面的代码中构建了单选按钮列表,并保留了 SelectedIndex = 0,然后在 onload 中我使用 JavaScript 调用了第一项的 click()。这是对我有用的最简单的事情。

于 2014-07-31T22:59:41.223 回答
0

我有这个问题,它以这种方式解决,您必须在 C# 代码(加载页面)和 html 标记中设置 AutoPostBack 和 SelectedIndexChange 事件处理程序。例如:

    protected void Page_Load(object sender, EventArgs e)
    {
            rblHighestDegree.AutoPostBack = true;
            rblHighestDegree.SelectedIndexChanged += 
             new EventHandler  (rblHighestDegree_SelectedIndexChanged);
    }

在 HTML 中:

    <asp:RadioButtonList ID="rblHighestDegree" runat="server" AutoPostBack="true"
    onselectedindexchanged="rblHighestDegree_SelectedIndexChanged">
于 2013-07-02T11:18:38.223 回答
0

我知道这是一个老问题,但正如 Jeff Shepler 所说,默认选项没有点击处理程序,部分回发不会创建一个。

我通过使用 UpdateModel="Always" (这是默认值)将第一个单选按钮列表包装在一个新的更新面板中来解决这个问题,因此它可以通过任何回发进行更新。

由于特定的表单布局,我无法使用将两个单选按钮列表放在同一个更新面板中的解决方案。

于 2016-08-24T12:58:18.430 回答