默认单选按钮不会触发UpdateControl回发

时间:2009-02-18 01:57:40

标签: asp.net ajax

我在表单上有三个单选按钮--A,B,C。这些选项中的每一个都会使用特定于该选项的数据填充下拉列表。当表单加载时,我设置选项A进行检查(作为默认值)。

当我选择按钮B或C时,AsyncPostBack触发正常并填充下拉列表。但是,随后从B或C中选择A不会触发事件。

我怀疑因为在加载表单时检查了A,浏览器没有看到任何“更改”来引发事件。

那么可以做些什么来启用默认的A按钮来识别它是从B或C更改以提高回发?

我已经尝试在仅在页面的初始加载中设置代码中的按钮A的检查状态(即IsPostBack为False),并且在html中设置radiobutton的checked属性,具有相同的结果。如果我没有默认单选按钮,则功能按预期工作,除了我没有在页面首次加载时默认的单选按钮和下拉列表。


html ...

<asp:RadioButton ID="radBook" runat="server" AutoPostBack="true" GroupName="grpArticleType" Text="Book" />
<asp:RadioButton ID="radCD" runat="server" AutoPostBack="true" GroupName="grpArticleType" Text="CD" />
<asp:RadioButton ID="radDVD" runat="server" AutoPostBack="true" GroupName="grpArticleType" Text="DVD" />

<asp:UpdatePanel ID="pnlTasks" runat="server" UpdateMode="Conditional" RenderMode="Inline">
<ContentTemplate>
   <asp:DropDownList ID="dropShippingSize" runat="server" CssClass="dropdownMandatory"></asp:DropDownList>
</ContentTemplate>
<Triggers>
   <asp:AsyncPostBackTrigger ControlID="radBook" />
   <asp:AsyncPostBackTrigger ControlID="radCD" />
   <asp:AsyncPostBackTrigger ControlID="radDVD" />
</Triggers>
</asp:UpdatePanel>

背后的代码......

Sub Page_Load
    If Not Me.IsPostBack Then
       radBook.Checked = True
    End If
End Sub

Private Sub rad_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
   Handles radBook.CheckedChanged, radCD.CheckedChanged, radDVD.CheckedChanged

      zLoadShippingSizeDropdown()

End Sub

5 个答案:

答案 0 :(得分:5)

我遇到了同样的问题并且需要几个小时寻找答案。这似乎与ViewState或类似的东西没有任何关系,但是使用预先检查的RadioButton作为Async PostBack的触发器有某种不兼容性。 我找到的工作非常简单,并且可以立即使用;而不是在标记上使用checked=true或在服务器端使用myRadioButton.Checked,我执行了以下操作:

未在标记上设置属性并在Page_Load事件中添加此内容:

if (!IsPostBack)
{
    MyRadioButton.InputAttributes["checked"] = "true";
    ...
}

我希望这有助于节省一些人的头发时间:)

答案 1 :(得分:1)

我猜你需要检查页面是否是你的加载事件中的回发:

protected void Form_Load(object sender, EventArgs e) 
{
    if (!Page.IsPostback) 
    {
        // Set radiobutton A...
    }
}

答案 2 :(得分:1)

我们遇到了同样的问题,似乎你必须将单选按钮的另一个“已选中”属性设置为“false”。 所以请添加行

radCD.Checked = False
radDVD.Checked = False

答案 3 :(得分:0)

您是否偶然也会在您的代码中处理viewstate?如果是这样,那么你需要处理它的AJAX版本,因为viewstate经常会在AJAX样式页面上丢失。尝试将按钮放在更新面板中,如果面板的更新模式设置为条件,请查看是否获得相同的行为。如果你这样做,不要担心回发触发器。

异步触发器仅适用于更新面板内的项目。面板外的任何项目都将按设计完成回发。

<asp:UpdatePanel ID="pnlTasks" runat="server" UpdateMode="Conditional" RenderMode="Inline">
<ContentTemplate> 
<asp:RadioButton ID="radBook" runat="server" AutoPostBack="true" GroupName="grpArticleType" Text="Book" />
<asp:RadioButton ID="radCD" runat="server" AutoPostBack="true" GroupName="grpArticleType" Text="CD" /><asp:RadioButton ID="radDVD" runat="server" AutoPostBack="true" GroupName="grpArticleType" Text="DVD" />
  <asp:DropDownList ID="dropShippingSize" runat="server" CssClass="dropdownMandatory">
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>

答案 4 :(得分:0)

哇,我以为我从未想过那可能是虫子。节省了数小时的挫折感。

感谢Juan经历了棘手的微软问题并找到了其余的解决方案。