回发时的 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 中的模型