ASP.Net AJAX UpdatePanel无法触发SelectedIndexChanged事件

6

我有一个ASP.Net的RadioButtonList控件,其AutoPostBack属性设置为true。同时,当用户更改选择时会调用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以启用异步PostBack之后(如上所示)。一旦我这样做,原始的RadioButtonList控件只有在选择了用户在页面上默认未选择的ListItem时才会PostBack。如果用户随后选择了原始默认选择,则不会发生PostBack。
为了澄清,如果我在不将适用的第二个控件放入ASP.Net AJAX UpdatePanel的情况下PostBack,则无论用户选择哪个RadioButtonList ListItem,SelectedIndexChanged都有效。另一方面,在我将控件放入UpdatePanel中以应用AsyncPostBackTrigger后,PostBack仅对非默认ListItems的选择发生。
更多相关信息是,我正在使用Microsoft Visual Studio 2008进行编码,我正在使用的UpdatePanel控件是Microsoft AJAX Library的一部分(而不是ASP.NET AJAX Control Toolkit)。
我希望能得到任何关于如何使ASP.Net AJAX起作用的见解,以便在用户选择默认或非默认ListItems时触发SelectedIndexChanged事件。值得一提的是,我尝试在page_load事件中设置RadioButtonList默认选择,但没有帮助。
感谢您提前提供的所有帮助!

请注意,我还尝试删除在aspx页面上定义的触发器,并在page_load事件中注册RadioButtonList控件:“scriptmanager1.RegisterPostBackControl(rblHighestDegree);”不幸的是,这种方法导致了与我之前抱怨的完全相同的行为。 - cjo30080
如果您查看生成的HTML,您会发现默认选定的单选按钮没有设置onclick来调用__doPostBack。 - Jeff Shepler
5个回答

5

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

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

然而,尽管ajax调用现在按预期工作,但服务器端代码仍未执行所选的IndexChanged处理程序。
我认为可能是因为服务器知道默认选择是什么,并且看到发布的选择相同,因此认为所选索引未更改,因此没有执行处理程序。
然后我想,当选择其他单选按钮之一时,服务器应该通过视图状态记住它。这使我想起了我的radiobuttonlist容器上有“viewstatemode =”Disabled“。因此,我将“viewstatemode =”Enabled“设置为radiobuttonlist,现在它正在按预期工作。

感谢您的回复。我尝试过了,但遗憾的是,在radiobuttonlist上设置viewstatemode="Enabled"并没有改变其行为或解决我的问题。 - cjo30080
仅启用视图状态是不够的。您是否已经附加了客户端单击处理程序以调用__doPostBack? - Jeff Shepler

2

你的链接已经失效了。你还记得有什么解决方法吗? - Protector one

0

我有这个问题,解决方法是,在C#代码(加载页面)中设置AutoPostBack和SelectedIndexChange事件处理程序,并在html标签中设置。例如:

    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">

0

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

我通过在新的UpdatePanel中包装第一个RadioButtonList,并将UpdateModel设置为“Always”(这是默认值),以便它可以由任何回发更新来解决这个问题。

由于特定的表单布局,我无法使用将两个RadioButtonList放在同一个UpdatePanel中的解决方案。


0
我在代码后端构建了单选按钮列表,并省略了SelectedIndex = 0,然后在onload中使用JavaScript调用了第一个项目的click()。这是对我最有效的最简单的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接