2010-04-13 117 views
0

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

我拿出了这个复选框,并把它解释成我能想到的最简单的例子。我将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"; 
} 
+0

你发布的代码应该可以工作,但我不确定如果我很好地理解它不适合你。你可以试着更好地解释它吗? – 2010-04-13 19:50:50

+0

FWIW下的文件,当我添加一对与页面具有相似行为的复选框时;他们正常工作。如果我使用VS立即窗口在PageLoad期间检查foo或bar,那么当foo不是回发时检查foo,否则两者都不会被检查。 – 2010-04-13 19:59:52

+0

代码不起作用 - 结果标签永远不会有任何文本,并且CheckedChanged事件(rbChanged)永远不会触发。 – 2010-04-13 20:00:28

回答

2

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

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

如果我们获得老板的许可,我们会将我们的适配器提供给CSSFriendly,以防其他人使用这种东西。

+0

有趣的问题和解决方案。对于它的价值 - 我过去使用过CSSFriendly适配器,并遇到比我想象的更小的问题。有时候“完美”的html真的被高估了。最终,最终用户可用的网站是关键。他们可以不关心有效的html。这是一个漂亮的标记和开发时间恕我直言之间的平衡行为。通常使用生成的标记框架(如ASP.NET)确保完全有效且“最佳实践”的HTML比其值得的麻烦更多。只是我2美分。 – 2010-04-14 14:02:53

+0

唯一的问题是,IE浏览器正在“暗淡”已禁用的标签。正如将其淡化为灰色,就像禁用的窗体控件一样。这基本上不可能读到一些背景颜色,我们不想说“我们不能使用背景颜色,因为我们无法控制HTML”,因为这很糟糕。 :) 仍然没有得到所有的扭结 - 它不会产生正确的组,如果你有一个命名容器要考虑。 MS有太多的内部方法! – 2010-04-14 14:35:11

+0

我认为问题是任何禁用的控件都将失去视图状态 – 2015-07-21 13:52:16

0

我测试了你的确切代码,它工作正常。当您选择任一单选按钮时,标记会在回发过程中更新,当页面刷新时会显示正确的信息。

+0

嗯。如果问题仍然存在,我会查看是否将该页面复制到新的解决方案中。 – 2010-04-13 20:03:58

+0

它实际上在新的解决方案中工作...诊断继续... – 2010-04-13 20:13:53

0

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

例如,

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

在不同的使用方法与上面相同的密钥名称可能是单选按钮自动回不灵的问题。 我遇到过这个问题,所以任何有同样问题的人都可以解决他们的问题。