C# 通过在asp.net中取消选中复选框,复选框消失

C# 通过在asp.net中取消选中复选框,复选框消失,c#,asp.net,web-applications,C#,Asp.net,Web Applications,我对复选框有问题。例如,我有这个aspx的代码 <asp:Content ID="MainContent" ContentPlaceHolderID="MainContent" runat="server"> <asp:CheckBox ID="chkActive" AutoPostBack="True" OnCheckedChanged="Active_OnCheckedChanged" runat="server"></asp: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在未选中时消失了,所以这个函数找不到它。有没有想法让复选框在未选中的情况下出现?谢谢

附言:“消失”意味着它不在请求中。当取消选中时,它不再处于表单中

编辑:

我的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)))
            {
                //
            }
        }            
    }
public void保存日期(T实体,NameValueCollection属性)
{
PropertyInfo[]properties=typeof(T).GetProperties();
foreach(属性中的PropertyInfo属性)
{
if(attributes.AllKeys.Any(key=>key.Contains(“$”+property.Name)))
{
//
}
}            
}

para属性来自Request.Form,因为复选框不再位于Request.Form中,所以我不知道如何处理它。如果选中复选框,此函数将正常工作。ASP.NET使用浏览器的本机
表单
功能将数据返回到服务器

当您“选中”复选框时,数据将作为
请求的一部分传回。表单
数据,然后ASP.NET可以将此信息用作其回发生命周期的一部分,以知道复选框已“选中”

但是,如果复选框是未选中的“已选中”,则
请求表单
数据中有一个条目-正是由于缺少数据,ASP.NET才知道复选框不再被选中


这是表单过帐中复选框的正常行为。

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

但是,ASP.NET WebForms控件复选框知道它们的状态(感谢viewstate),并将指示它们是否被选中,只需直接查询复选框对象,而不使用请求。表单集合,如下所示:

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

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

但是。。。在您的函数中,use可以使用服务器端对象,因为该值会在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事件中。选中后,将隐藏输入的“禁用”属性设置为true。取消选中时,将禁用属性设置为false。禁用的控件不会像未选中的复选框一样发送回服务器,因此如果选中该复选框,则应禁用输入,反之亦然。

所说的“消失”是指,它不在回发时的
请求中。表单
收集中?@ChrisGessler:是的,确实,它不在请求中。如果未选中,则不再是表单。有什么想法吗?感谢不在请求中。表单与呈现的控件无关。向我们介绍正在生成的HTML。您好,谢谢,现在我了解了更多有关复选框行为的信息。当复选框未选中时,您是否知道任何解决方案或解决方法来处理复选框?Thanks@Qui,我不能100%肯定我理解你所说的“处理复选框”是什么意思。你是在说服务器端还是客户端?正如Dai和Chris所回答的,您可以检查控件的
.Checked
属性。。。但是这只会在表单属性在生命周期中被处理后才起作用,换句话说,在页面加载中或之后。谢谢,我明白了它们的意思。我编辑了我的问题,所以也许我的意思更清楚。我编辑了我的问题,请看一下。谢谢你的帮助。我编辑了我的问题,也许你会发现我的意思更清楚。谢谢你按照你的建议做了,

,然后我使用了
document.getElementById(“hiddenExtern”).disabled=true | false

,但它不起作用,因为disabled属性不适用于hidden类型。谢谢。@QuiTran-隐藏的输入字段确实支持disabled属性。检查这篇帖子-嗨,我成功了。我仍然使用隐藏的输入,并在SaveData函数中处理其名称,以将复选框的状态保存到DB。谢谢你的帮助:)