ASP.NET中取消勾选复选框后复选框消失了

3

我有一个 checkbox 的问题。举个例子,我有这段 aspx 代码:

<asp:Content ID="MainContent" ContentPlaceHolderID="MainContent" runat="server">
     <asp:CheckBox ID="chkActive" AutoPostBack="True" OnCheckedChanged="Active_OnCheckedChanged" runat="server"></asp:CheckBox>
     <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</asp:Content>

在服务器端,当检查chkActive时,我有两个渲染控件:
  • ctl00$MainContent$chkActive
  • ctl00$MainContent$txtName
当chkActive未被选中时,我只有一个已渲染的控件:
  • ctl00$MainContent$txtName
因此,我无法将该复选框的状态写入数据库。我使用一个带有动态对象的SaveData函数记录,并且在未选中时chkActive消失了,所以这个函数找不到它。有什么办法使复选框即使未选中也出现?谢谢。
注: "消失" 表示未选中时,它不再出现在Request.Form 中。
我的 SaveData 函数:
public void SaveDate<T>(T entity, NameValueCollection attributes)
    {
        PropertyInfo[] properties = typeof(T).GetProperties();
        foreach (PropertyInfo property in properties)
        {
            if (attributes.AllKeys.Any(key => key.Contains("$" + property.Name)))
            {
                //
            }
        }            
    }

para属性来自Request.Form,由于复选框不再存在于Request.Form中,所以我不知道该如何处理它。如果复选框被选中,则此函数运行良好。


你所说的“消失”,是指在PostBack时它不在“Request.Form”集合中吗? - Chris Gessler
@ChrisGessler:是的,确切地说,当未选中时,它不再在Request.Form中。有什么想法吗?谢谢。 - Ragnarsson
不在Request.Form中并不意味着控件没有被渲染。渲染是关于生成的HTML的。 - Dai
3个回答

1

ASP.NET使用浏览器的本地form功能将数据返回到服务器。

当您“勾选”复选框时,数据作为Request.Form数据的一部分传递回来,然后ASP.NET可以将此信息用作其后续生命周期的一部分,以知道复选框是否已“勾选”。

但是,如果未“勾选”复选框,则在Request.Form数据中没有条目 - 正是这种缺乏数据使ASP.NET知道复选框不再被选中。

这是表单提交的复选框的正常行为。


嗨,谢谢,现在我更了解复选框的行为了。你知道如何处理未选中复选框的解决方案或变通方法吗?谢谢。 - Ragnarsson
@Qui,我不确定我完全理解你所说的“处理复选框”的意思。你是在谈论服务器端还是客户端?正如Dai和Chris所回答的那样,您可以检查控件的.Checked属性...但这只能在表单属性在生命周期中被处理后才能起作用,换句话说,在Page_Load之中或之后。 - freefaller
谢谢,我明白他们的意思了。我编辑了我的问题,现在可能更清楚我想表达什么了。 - Ragnarsson

1

正如其他人所提到的那样,复选框的值(未选中)不会被发送回服务器,因此它将不会出现在Request.Form集合中。

但是...在您的函数中,可以使用服务器端对象,因为该值在ViewState中被发送回来了(如果您已经启用了它)。

this.chkActive.Checked在客户端未选中并提交时应为false。

如果仍然想使用Request.Form,则可以随时检查集合中是否存在该条目。如果不存在,则复选框为false或未选中。

if(Request.Form["chkActive"] == null)
  // checkbox is unchecked
else
  // checkbox is checked

编辑

为了使复选框出现在Request.Form集合中,只需向表单添加一个隐藏输入,并将其命名为与复选框相同的名称。

<input type="hidden" value="false" name="chkActive" />

在复选框的 OnClick 事件中添加客户端事件处理程序。当选中时,将隐藏输入的 disabled 属性设置为 true。当取消选中时,将 disabled 属性设置为 false。禁用的控件不会像未选中的复选框一样发送回服务器,因此如果复选框被选中,则应禁用输入,反之亦然。

我编辑了我的问题,也许你会发现我想表达的更清楚了。谢谢。 - Ragnarsson
我按照你的建议做了:<br/><input type="hidden" value="false" name="chkActive" id="hddActive"/><br/>然后我使用了<br/> document.getElementById("hiddenExtern").disabled = true | false <br/>但是它没有起作用,因为disabled属性在type为hidden时不起作用。无论如何还是谢谢。 - Ragnarsson
@QuiTran - 隐藏的输入字段确实支持disabled属性。请查看此帖子 - https://dev59.com/U3M_5IYBdhLWcg3wcSx_ - Chris Gessler
嗨,我成功了。我仍然使用了隐藏输入,并在我的SaveData函数中处理它的名称,以将复选框的状态保存到数据库中。感谢您的帮助 :) - Ragnarsson

0

当复选框未被选中时,它们没有值,因此浏览器不会将它们包括在返回的字段中。这与 ASP.NET 无关,而是与 HTML 表单的工作方式有关。

然而,ASP.NET WebForms 控件的复选框能够感知它们的状态(感谢视图状态),并将指示它们是否被选中,只需直接查询复选框对象,而不使用 Request.Form 集合,像这样:

if( this.chkActive.Checked ) { ...

我编辑了我的问题,请看一下。感谢帮助。 - Ragnarsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接