回发时的 ASP.Net 复选框值错误?

Posted

技术标签:

【中文标题】回发时的 ASP.Net 复选框值错误?【英文标题】:ASP.Net Checkbox value at postback is wrong? 【发布时间】: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 输入并不能解决问题。 【参考方案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>

【讨论】:

以上是关于回发时的 ASP.Net 复选框值错误?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将复选框列表绑定到 asp.net mvc 中的模型

回发时“找不到指定的 URL”-asp.net windows 身份验证

如何避免在回发时从 asp.net 重复输入?

__DoPostback 在进行部分回发时回发禁用控件的值

asp.net sessionID 在回发时更改?

asp .net背景图像在回发时闪烁