【问题标题】:ASP.Net RadioButton loses ViewStateASP.Net RadioButton 失去 ViewState
【发布时间】:2011-02-07 15:02:54
【问题描述】:

我在使用包含两个单选按钮的简单单选集时遇到问题(我不想使用 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";
}

【问题讨论】:

  • 你发布的代码应该可以工作,但我不确定我是否理解它对你不起作用。你能试着解释一下吗?
  • FWIW 下的文件,当我向页面添加一对具有类似行为的复选框时;他们工作正常。如果我在 PageLoad 期间使用 VS 的即时窗口检查 foo 或 bar,则在不是回发时检查 foo,否则不会检查。
  • 代码不起作用——结果标签永远不会有任何文本,并且 CheckedChanged 事件 (rbChanged) 永远不会触发。
  • 您可能想尝试删除您的页面并重新创建它。也许在调试和文件锁定之间,设计器文件变得混乱了。正如我在下面的回答所述,我在一个新的 aspx 页面中测试了您的 exact 代码,它工作正常。当您选择任一单选按钮时,页面会回发并更新标签。
  • 也许 page_load 中的某些东西正在重置它?

标签: asp.net postback viewstate radio-button


【解决方案1】:

事实证明,这是因为我们有一个自定义适配器为单选按钮(或者更准确地说,为所有 System.Web.UI.WebControls.CheckBox es)呈现 HTML。我们这样做的动机是因为 .NET 将在 LABEL 上放置一个 disabled="disabled" 属性,并且输入是错误的 HTML,更糟糕的是,IE 实际上将其解释为意味着什么! (自己检查一下——编写一个带有标签 disabled="disabled" 的 HTML 页面并在 FF 和 IE 中进行测试。)

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

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

【讨论】:

  • 有趣的问题和解决方案。值得一提的是——我过去曾使用过 CSSFriendly 适配器,但遇到的小问题比我想象的要多。有时拥有“完美”的 html 确实被高估了。最后,对最终用户可用的站点是关键。他们可能不太关心有效的 html。恕我直言,这是漂亮标记和开发时间之间的平衡行为。通常使用生成的标记框架(如 ASP.NET)确保完全有效和“最佳实践”的 html 比它的价值更麻烦。只是我的 2 美分。
  • 唯一的问题是 IE 正在“调暗”被禁用的标签。就像禁用的表单控件一样将其淡化为浅灰色。这在某些背景颜色上基本上是无法阅读的,我们不想说“我们不能使用那种背景颜色,因为我们无法控制 HTML”,因为这很糟糕。 :) 仍然没有解决所有问题——如果您要考虑命名容器,它不会生成正确的组。 MS的内部方法太多了!
  • 我认为问题是任何禁用的控件都会丢失视图状态
【解决方案2】:

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

【讨论】:

  • 嗯。如果问题仍然存在,我会看看是否将页面复制到新的解决方案中。
【解决方案3】:

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

例如

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2010-11-24
    相关资源
    最近更新 更多