使用 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
不会成为垃圾-集。
其次,在您的情况下这样做是没有意义的,因为它不会实现您想要做的事情。您添加到Dictionary
的CheckBox
类的实例不会是您希望在后续请求中与之交互的同一个实例;您存储在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 集合中加载其状态。在我看来,您想在服务器上操作页面的控制树,但需要在每个请求上重新构建,并且仅在处理请求期间存在。页面呈现给客户端后,控件树不再存在。
因此,您可以使用 javascript 将 html 输入复选框的值发布到服务器,但是您会将它们发送到哪里以及您希望发生什么?看起来您正在与 ASP.NET Webforms 做事的方式作斗争,这种方式围绕回发和处理请求的服务器上的 Page 对象。
【讨论】:
感谢静态成员,但实际上我认为我不能在页面中添加控件,因为我上面的代码只是一个示例,而真正的项目是一个用户控件,它可以从一个类型动态定义和呈现控件,嗯场景是这样的:客户端添加用户控件的程序集并声明该命名目标类型的属性,用户控件读取目标并为每个属性决定必须添加哪个控件,因此通过覆盖的 RenderContents 和其他方法可以将控件添加到页面,所以每个控件都会自动有一个复选框来启用/禁用控件,我需要选中的属性 我已经扩展了我的答案,Saeid,但老实说,我认为您可能误解了 ASP.NET Web 窗体的工作原理。 Steve,谢谢,我理解你的扩展,我不想操作控制树,这就解决了,再次感谢。【参考方案2】:使用这个可能有用,这是您需要的所有测试,并让我知道结果:
Loop through checkboxes and count each one checked or unchecked
【讨论】:
【参考方案3】:请记住一些简单的事情:您必须在每个回传中添加动态控件。这将为您节省大量时间。
【讨论】:
以上是关于使用 jQuery 查找未选中的复选框并将名称传递给 C# 代码的主要内容,如果未能解决你的问题,请参考以下文章