【问题标题】:Checkbox disappeared by unchecking it in asp.net复选框通过在 asp.net 中取消选中而消失
【发布时间】:2012-09-03 07:10:47
【问题描述】:

我的复选框有问题。比如我有这个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:“消失”表示未选中时不再出现在 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 集合中吗?
  • @ChrisGessler:是的,确切地说,未选中时它不再位于 Request.Form 中。任何想法?谢谢
  • 不在 Request.Form 中与正在呈现的控件无关。向我们展示正在生成的 HTML。

标签: c# asp.net web-applications


【解决方案1】:

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

但是...在您的函数中,use 可以使用服务器端对象,因为该值已发布回 ViewState(前提是您已启用)。

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

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

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。禁用的控件不会像未选中的复选框一样发送回服务器,因此如果选中了复选框,则应禁用输入,反之亦然。

【讨论】:

  • 我编辑了我的问题,也许你会发现我的意思更清楚了。谢谢
  • 我按照你的建议做了,
    &lt;input type="hidden" value="false" name="chkActive" id="hddActive"/&gt;
    然后我用了
    document.getElementById("hiddenExtern").disabled = true | false
    但是没用,因为禁用了属性不适用于隐藏类型。还是谢谢。
  • @QuiTran - 隐藏的输入字段确实支持 disabled 属性。检查这篇文章 - stackoverflow.com/questions/1374147/…
  • 嗨,我成功了。我仍然使用隐藏的输入,并在我的 SaveData 函数中处理了它的名称,以将复选框的状态保存到 DB。感谢您的帮助:)
【解决方案2】:

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

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

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

【讨论】:

  • 我编辑了我的问题,请看一下。感谢您的帮助。
【解决方案3】:

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

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

但如果复选框没有“选中”,它确实没有Request.Form 数据中有条目 - ASP.NET 正是这种缺乏数据用于知道复选框不再被选中。

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

【讨论】:

  • 嗨,谢谢,现在我对复选框的行为有了更多的了解。您是否知道在未选中复选框时处理复选框的任何解决方案或解决方法?谢谢
  • @Qui,我不是 100% 确定我理解您所说的“处理复选框”是什么意思。你说的是服务器端还是客户端?正如 Dai 和 Chris 所回答的那样,您可以检查控件的 .Checked 属性......但这仅在表单属性在生命周期中处理后才有效,换句话说,在 Page_Load 中或之后
  • 谢谢,我明白他们的意思了。我编辑了我的问题,所以也许我的意思更清楚了。
猜你喜欢
  • 1970-01-01
  • 2013-06-24
  • 2016-12-08
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
相关资源
最近更新 更多