使用 jQuery 查找未选中的复选框并将名称传递给 C# 代码

Posted

技术标签:

【中文标题】使用 jQuery 查找未选中的复选框并将名称传递给 C# 代码【英文标题】:Find Unchecked Checkboxes with jQuery and pass the Names to C# Code 【发布时间】:2011-10-30 13:42:21 【问题描述】:

这是我的代码:

public class MyCollection 
        internal static Dictionary<string, CheckBox> MyCheckBox = new Dictionary<string, CheckBox>();
    


    protected void Page_Load(object sender, EventArgs e) 

        if (!IsPostBack) 
            CheckBox chk1 = new CheckBox();
            chk1.ID = "chk1";
            chk1.Checked = true;
            if (!MyCollection.MyCheckBox.ContainsKey(chk1.ID))
                MyCollection.MyCheckBox.Add(chk1.ID, chk1);

            CheckBox chk2 = new CheckBox();
            chk2.ID = "chk2";
            chk2.Checked = true;
            if (!MyCollection.MyCheckBox.ContainsKey(chk2.ID))
                MyCollection.MyCheckBox.Add(chk2.ID, chk2);

            pl1.Controls.Add(chk1);
            pl2.Controls.Add(chk2);
        
    

    protected void btn1Click(object sender, EventArgs e) 
        lit1.Text = "Chk1.Checked: " + MyCollection.MyCheckBox["chk1"].Checked.ToString();
        lit1.Text += "<br />Chk2.Checked: " + MyCollection.MyCheckBox["chk2"].Checked.ToString();
    

我有 2 个复选框,但总是在按下按钮时,Checkboxes.Checked 为真,当我取消选中它们时, 我如何在上面的某些字典中保留复选框并以正确的方式检查它们的 Checked 属性? 实际上我不想要任何更改复选框的事件,我想一个 jQuery 脚本,当我按下按钮时,我会检索未选中的复选框的名称 我找到一个 jQuery 可以找到未选中的复选框名称,但我不知道如何将名称传递给 c# 代码?

我上面的代码只是一个示例,真正的项目是一个用户控件,它从一个类型动态定义和呈现控件,嗯,场景是这样的:客户端添加用户控件的程序集并声明该命名目标的属性类型,用户控件读取目标,并为每个属性决定必须添加哪个控件,因此通过覆盖的 RenderContents 和其他方法可以将控件添加到页面,因此每个控件都会自动具有一个启用/禁用控件的复选框,我需要选中的属性

我在***...找到了这个代码

var sList = "";
$('input[type=checkbox]').each(function () 
var sThisVal = (this.checked ? "1" : "0");
sList += (sList=="" ? sThisVal : "," + sThisVal);
);
console.log (sList);

但是这段代码只是在控制台上写了 sList,如何在 C# 代码中检索 sList 值?

【问题讨论】:

我在这里找到它:[从 jQuery 检索值到 C# 代码][1] [1]:***.com/questions/7951202/… 【参考方案1】:

首先,您应该从不在静态成员中存储诸如CheckBox 之类的控件实例,因为这是导致应用程序内存泄漏的原因。 ASP.NET Control 类持有对其包含 Page 的引用,因此通过将 Control 添加到静态集合中,您将保持整个 Page 实例及其所有子 Controls 不会成为垃圾-集。

其次,在您的情况下这样做是没有意义的,因为它不会实现您想要做的事情。您添加到DictionaryCheckBox 类的实例不会是您希望在后续请求中与之交互的同一个实例;您存储在Dictionary 中的实例仅用于该请求,这就是为什么CheckBox 实例总是从它们的Checked 属性返回true

我不认为 JQuery 在这里是相关的,因为它不会帮助您在服务器上重构 CheckBox 控件。您需要做的是在每个请求上将CheckBox 控件添加到Page。为了使CheckBox 控件从Form 集合中加载其状态,您需要在Page 生命周期中尽早添加Controls:我建议尝试在Page.Init 事件期间添加它们。

public void Page_Init(object sender, EventArgs e)

   CheckBox chk1 = new CheckBox();
   chk1.ID = "Chk1";

   CheckBox chk2 = new CheckBox();
   ck2.ID = "Chk2";

   if(!IsPostBack)
   
      ck1.Checked = true;
      ck2.Checked = true;
   

   p1.Controls.Add(chk1);
   p2.Controls.Add(chk2);

如果没有实际的代码,就很难理解您正在尝试做什么以及您将如何去做。但是,事实仍然是,如果您不在每个请求上将 CheckBox 控件添加到 Page,那么它们将无法参与 Page 生命周期,并且在提交 Page 时不会从 Form 集合中加载其状态。在我看来,您想在服务器上操作页面的控制树,但需要在每个请求上重新构建,并且仅在处理请求期间存在。页面呈现给客户端后,控件树不再存在。

因此,您可以使用 javascripthtml 输入复选框的值发布到服务器,但是您会将它们发送到哪里以及您希望发生什么?看起来您正在与 ASP.NET Webforms 做事的方式作斗争,这种方式围绕回发和处理请求的服务器上的 Page 对象。

【讨论】:

感谢静态成员,但实际上我认为我不能在页面中添加控件,因为我上面的代码只是一个示例,而真正的项目是一个用户控件,它可以从一个类型动态定义和呈现控件,嗯场景是这样的:客户端添加用户控件的程序集并声明该命名目标类型的属性,用户控件读取目标并为每个属性决定必须添加哪个控件,因此通过覆盖的 RenderContents 和其他方法可以将控件添加到页面,所以每个控件都会自动有一个复选框来启用/禁用控件,我需要选中的属性 我已经扩展了我的答案,Saeid,但老实说,我认为您可能误解了 ASP.NET Web 窗体的工作原理。 Steve,谢谢,我理解你的扩展,我不想操作控制树,这就解决了,再次感谢。【参考方案2】:

使用这个可能有用,这是您需要的所有测试,并让我知道结果:

Loop through checkboxes and count each one checked or unchecked

【讨论】:

【参考方案3】:

请记住一些简单的事情:您必须在每个回传中添加动态控件。这将为您节省大量时间。

【讨论】:

以上是关于使用 jQuery 查找未选中的复选框并将名称传递给 C# 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jquery ajax检查或不检查复选框[重复]

所有未禁用的选中复选框的 jquery 选择器

HTML 复选框元素未将值传递给 jQuery 和 AJAX 字符串

强制复选框始终提交,即使未选中

jquery复选框未选中

Jquery,如何获取复选框未选中事件和复选框值?