通过在asp.net中取消选中它,Checkbox消失了

时间:2012-09-10 12:04:51

标签: 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>
     <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</asp:Content>

在服务器端,当选中chkActive时,我有两个渲染控件:

  • ctl00 $ MainContent $ chkActive
  • ctl00 $ $搜索Maincontent txtName的

当未选中chkActive时,我只有一个渲染控件:

  • ctl00 $ $搜索Maincontent txtName的

所以我无法将该复选框的状态写入数据库。为了记录,我使用带有动态对象的SaveData函数,并且当未选中时chkActive消失,因此该函数无法找到它。任何想要复选框的想法都会出现,即使它未经检查?感谢。

P.S:&#34;消失了#34;意味着它在取消选中时不再出现在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中,所以我不知道如何处理它。如果选中复选框

,此功能很有效

3 个答案:

答案 0 :(得分:1)

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

当您“选中”一个复选框时,数据将作为Request.Form数据的一部分传回,然后ASP.NET可以将此信息用作其后期生命周期的一部分,以便知道复选框是“检查”。

但是,如果复选框“已选中”,那么会在Request.Form数据中输入一个条目 - 这就是ASP缺少的数据.NET使用知道不再检查复选框。

这是复选框作为表单发布的一部分的正常行为。

答案 1 :(得分:1)

正如其他人所提到的,复选框(未选中)的值不会发送回服务器,因此它不会显示在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事件添加客户端事件处理程序。选中后,将隐藏输入的disabled属性设置为true。取消选中时,将disabled属性设置为false。禁用的控件不会像未选中的复选框一样发送回服务器,因此如果选中该复选框,则应禁用输入,反之亦然。

答案 2 :(得分:0)

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

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

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