ASP.Net RadioButton失去了ViewState

时间:2010-04-13 19:42:33

标签: asp.net postback viewstate radio-button

我在使用两个单选按钮的简单收音机时遇到问题(我不想使用RadioButtonList [RBL],因为RBL不允许子控件,在我的情况下,如果你选择一个选项,我想在按钮旁边启用一个文本框;是的,你可以用jQuery来破解它来移动文本框,但这很脏!)。我会检查一个,提交表单(显式或通过AutoPostBack),CheckedChanged事件永远不会触发。重新加载页面时,无论是非回发加载时的初始状态还是表单提交前的状态,都将取消选中这两个按钮。

我取出了复选框并将其剥离到我能想到的最简单的例子。我把所有地方的EnableViewState = true都扔了,以防万一我找不到它。

<form id="form1" runat="server" enableviewstate="true">
    <div>
        <asp:RadioButton ID="foo" Text="foo" runat="server" AutoPostBack="true" OnCheckedChanged="rbChanged" Checked="true" GroupName="foobar" EnableViewState="true" />
        <asp:RadioButton ID="bar" Text="bar" runat="server" AutoPostBack="true" GroupName="foobar"
            OnCheckedChanged="rbChanged" Checked="false" EnableViewState="true" />
        <asp:Label runat="server" ID="resultLbl" />
    </div>
</form>

protected void rbChanged(object sender, EventArgs e)
{
    if (foo.Checked) resultLbl.Text = "foo is checked";
    else if (bar.Checked) resultLbl.Text = "bar is checked";
    else resultLbl.Text = "neither is checked";
}

3 个答案:

答案 0 :(得分:2)

事实证明这是因为我们有一个自定义适配器为一个radiobutton呈现HTML(或者确切地说,对于所有System.Web.UI.WebControls.CheckBox es)。我们的动机是因为.NET会在LABEL和输入上放置一个disabled =“disabled”属性,这是糟糕的HTML,更糟糕的是,它实际上被解释为IE的意思! (自己检查一下 - 写一个禁用标签的HTML页面=“禁用”并在FF和IE中测试。)

我们使用Reflector查看我们混合的步骤与真实适配器的步骤,并发现Name属性设置不正确。虽然它将给定组中的所有RB设置为相同的Name,但在我们的有限新解决方案测试用例中,它与我们的自定义适配器测试用例中的Name属性不同。当我们看到如何安全地生成它时,我们发现我们的回发突然起作用了!

如果我们得到老板的许可,我们会将其适配器贡献给CSSFriendly,以防其他人使用此类东西。

答案 1 :(得分:0)

我已经测试了您的确切代码,它运行正常。当您选择任一单选按钮时,在回发期间更新标签并在页面刷新时显示正确的信息??

答案 2 :(得分:0)

在某些情况下,问题可能是由代码隐藏中的ScriptManager造成的。

例如

ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "DisplayMessage", "javascript: HideProcessingImage();", true);

在上述不同方法中使用相同的键名可能是单选按钮自动回复无法正常工作的问题。 我遇到过这个问题,所以有同样问题的人都可以解决他们的问题。