3

我的复选框有问题。例如,我有这个 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 在未选中时消失了,因此该函数找不到它。即使未选中复选框,任何想法都会出现?谢谢。

PS:“消失”表示未选中时它不再位于 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 中,所以我不知道如何处理它。如果选中复选框,此功能效果很好

4

3 回答 3

1

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

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

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

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

于 2012-09-10T12:19:20.190 回答
1

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

但是......在您的函数中,使用可以使用服务器端对象,因为该值已发布回 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。禁用的控件不会像未选中的复选框一样发送回服务器,因此如果选中了复选框,则应禁用输入,反之亦然。

于 2012-09-10T12:25:37.667 回答
0

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

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

if( this.chkActive.Checked ) { ...
于 2012-09-10T12:20:08.037 回答