回发时ASP.Net Checkbox值是错误的?

时间:2009-10-06 04:34:02

标签: asp.net checkbox client postback

我们有一个最初禁用和检查的复选框。然后通过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的值。确实如此,即使它在表格上未经检查。

5 个答案:

答案 0 :(得分:34)

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

解决方法是向页面添加隐藏字段以表示复选框的状态,然后在单击复选框时将字段值更新为“ON”或“OFF”。

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

答案 1 :(得分:13)

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

Request.Form[CheckBox1.UniqueID]

如果选中此框,它将为'on',否则为null。

答案 2 :(得分:1)

我可能无法正确理解问题,但您不能只使用请求中的表单来检索CheckBox值吗?因此,在代码隐藏文件的button2Click()中,您可以执行此操作:

Request.Form[CheckBox1.UniqueID]

答案 3 :(得分:0)

你可以使用这样的东西。

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

如果没有检查它,它将不会首先传递它,但这应该解释它。

答案 4 :(得分:0)

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

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