【问题标题】:ASP.Net Checkbox value at postback is wrong?回发时的 ASP.Net 复选框值错误?
【发布时间】:2010-12-04 03:53:18
【问题描述】:

我们有一个最初被禁用和选中的复选框。然后通过 javascript 在客户端启用它。如果用户随后取消选中该框并按下按钮以调用回发,则复选框的状态在服务器端保持为选中状态。这显然是不受欢迎的行为。这是一个例子。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testcb.aspx.cs" Inherits="ESC.testcb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">

    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <script type="text/javascript">
        function buttonClick() {
            var cb = document.getElementById('<%= CheckBox1.ClientID %>');
            cb.disabled = false;
            cb.parentNode.disabled = false;
        }


    </script>

    <div>
        <asp:CheckBox ID="CheckBox1" runat="server" Checked="true" Enabled="false" />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="buttonClick(); return false;" />
        <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="button2Click" />
    </div>
    </form>
</body>
</html>

以及服务器端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ESC
{
    public partial class testcb : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void button2Click(object sender, EventArgs e)
        {
            string h = "";
        }
    }
}

所以我们在“string h”行中断并检查 CheckBox1.Checked 的值。这是真的,即使它在表单上未选中。

【问题讨论】:

  • 这是因为当您从后面的代码中设置控件的属性时,您的页面的视图状态没有得到更新。
  • 使用 HTML 控件代替服务器控件,我相信您的问题已经解决。
  • @Kamran,Viewstate 不是问题。
  • 切换到 HTML 输入并不能解决问题。

标签: asp.net checkbox client postback


【解决方案1】:

这是 ASP.NET 的一个已知问题 - 出于某种原因,如果在页面加载期间禁用复选框并且未检查回发,则 ASP.NET 不会更新回发复选框。我不知道为什么会这样 - 如果您默认取消选中复选框并选中它,则服务器上的值会正确更改。

解决方法是在页面中添加一个隐藏字段来表示复选框的状态,然后将字段的值更新为“ON”或“OFF”,例如,每当单击复选框时。

然后在服务器上检查隐藏字段的值,而不是复选框本身,因为隐藏字段总是被发布。

【讨论】:

  • 嗨,Sam,您能否提供有关“已知问题”的更多信息?知识库或链接?我有一个缺少“取消选中”的复选框;离开OnInit时启用==True,checked=false; enabled==True,进入Page_load时checked=true;但是它没有被浏览器选中,如果之前发生了另一个未发布的异步回发,它会按预期工作。
  • 谢谢,我遇到了同样的问题。经过我身边的大量调查后偶然发现了这篇文章,最后才知道这是 ASP.NET 中的一个已知问题 :) 解决方案对我有用。
【解决方案2】:

由于您已经在使用 Javascript 来操作浏览器中的控件状态,因此我建议您只禁用页面加载事件上的复选框。然后你的回发就可以正常工作了......

<head>

  <script type="text/javascript">
    function buttonClick() {
      var cb = document.getElementById('<%= CheckBox1.ClientID %>');
      cb.disabled = false;
      cb.parentNode.disabled = false;
    }    
  </script>

</head>
<body onload="document.getElementById('<%= CheckBox1.ClientID %>').disabled = true;">
  <form id="form1" runat="server">
  <div>
    <asp:checkbox id="CheckBox1" runat="server" checked="true" />
    <asp:button id="Button1" runat="server" text="Button" onclientclick="buttonClick(); return false;" />
    <asp:button id="Button2" runat="server" text="Button2" onclick="button2Click" />
  </div>
  </form>
</body>

【讨论】:

  • 我在我的项目中做了类似的事情。然而,这对安全性不是很好。如果用户禁用 Javascript,他基本上可以选中该框并按保存而不会受到阻碍。
【解决方案3】:

我可能没有正确理解这个问题,但你不能只使用请求中的表单来检索CheckBox 值吗?所以在 button2Click() 文件后面的代码中你会这样做:

Request.Form[CheckBox1.UniqueID]

【讨论】:

  • 不,浏览器不需要回发禁用表单元素的值。
【解决方案4】:

我遇到了类似的问题,CheckBox 对象的 Checked 属性未正确更新,以获取您可以检查的实际发布值:

Request.Form[CheckBox1.UniqueID]

如果选中该框,则为“on”,否则为 null。

【讨论】:

  • (6 年后...)这很奇怪。我的 ASP.Net 应用程序“有时”为我的 ASP.Net 复选框报告错误的 Checked 值,并且有时此建议确实有效...其他时候它会引发异常,因为此控件的值不是在 Request.Form 值中找到...
  • 这只是对我有用,而没有其他方法!该值为“on”,但选中的属性为“false”。
【解决方案5】:

你可以使用这样的东西。

if ((Request.Params["Checkbox1"] ?? "").ToString() == "on")

如果不检查,一开始就不会通过,但这应该可以解释这一点。

【讨论】:

    【解决方案6】:

    如果您需要避免重新编译源代码,这里有一个替代解决方案。 它只是在提交表单之前启用复选框。 1:在提交按钮中添加以下参数:OnClientClick="EnableCheckbox()" 2:在页面某处添加这个简单的功能以启用它

    <script> 
           function EnableCheckbox() {
                document.getElementById("<%=chkMyCheckbox.clientID  %>").disabled = false;
            } 
    </script>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2012-03-18
      相关资源
      最近更新 更多