![](/img/trans.png)
[英]HiddenField.ValueChanged Event not firing when changed from Javascript
[英]HiddenField EventHandler ValueChanged not fired when changed via Javascript
我有一个在ASP.NET服务器控件内创建的HiddenField控件。 我为ValueChanged事件添加了一个新的EventHandler。
当我的HiddenField的值从javascript函数中更改时,会触发此事件吗?
我遇到的主要问题是,当值已更改或至少在回发之前,尝试检索我的HiddenField服务器端的值。 我在一个页面内有一个服务器控件,该页面包含一个导致回发的按钮,我最初尝试使用SaveControlState / LoadControlState,但是由于某种原因,从未在回发发生之前调用SaveControlState。 我需要能够从ValueChanged事件中或回发之前捕获值。
这是代码:
public class ObjectTree : WebControl {
private CA.TreeView _treeView;
private HiddenField fldCheckedNodes = new HiddenField();
public CA.TreeView TreeView {
get { return _treeView; }
set { _treeView = value; }
}
public ObjectTree() {
_treeView = new CA.TreeView();
_treeView.ID = "objectTree";
fldCheckedNodes.ID = "fldCheckedNodes";
}
protected void fldCheckedNodes_ValueChanged(Object sender, EventArgs e) {
string test = fldCheckedNodes.Value;
}
protected override void OnPreRender(EventArgs e) {
TreeView.ClientSideOnNodeCheckChanged = TreeView.ClientID + "NodeChecked";
fldCheckedNodes.ValueChanged += new EventHandler(fldCheckedNodes_ValueChanged);
if (!Page.ClientScript.IsClientScriptBlockRegistered("jscript")) {
StringBuilder jscript = new StringBuilder();
jscript.AppendLine(" function " + TreeView.ClientID + "UpdateCheckedNodes() {");
jscript.AppendLine(" var x = 0;");
jscript.AppendLine(" var nodeArray = " + TreeView.ClientID + ".get_nodes().get_nodeArray();");
jscript.AppendLine(" var nodeLength = nodeArray.length;");
jscript.AppendLine(" document.getElementById('" + fldCheckedNodes.ClientID + "').value = \"\";");
jscript.AppendLine(" for (x=0; x < nodeLength; x++) {");
jscript.AppendLine(" examineNode(nodeArray[x]);");
jscript.AppendLine(" }");
jscript.AppendLine(" var result = document.getElementById('" + fldCheckedNodes.ClientID + "').value;");
jscript.AppendLine(" return true;");
jscript.AppendLine(" }");
jscript.AppendLine(" function examineNode(node) {");
jscript.AppendLine(" var y = 0;");
jscript.AppendLine(" var childNodes = node.get_nodes().get_nodeArray();");
jscript.AppendLine(" var childNodeLength = childNodes.length;");
jscript.AppendLine(" if (node.get_checked()) {");
jscript.AppendLine(" if (document.getElementById('" + fldCheckedNodes.ClientID + "').value.length > 0) {");
jscript.AppendLine(" document.getElementById('" + fldCheckedNodes.ClientID + "').value += \",\"; ");
jscript.AppendLine(" document.getElementById('" + fldCheckedNodes.ClientID + "').value += node.get_id();");
jscript.AppendLine(" } else {");
jscript.AppendLine(" document.getElementById('" + fldCheckedNodes.ClientID + "').value += node.get_id();");
jscript.AppendLine(" }");
jscript.AppendLine(" }");
jscript.AppendLine(" if (childNodeLength >= 1) {");
jscript.AppendLine(" for (y=0; y < childNodeLength; y++) {");
jscript.AppendLine(" examineNode(childNodes[y]);");
jscript.AppendLine(" }");
jscript.AppendLine(" } ");
jscript.AppendLine(" }");
jscript.AppendLine("</script>");
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "jscript", jscript.ToString());
}
base.OnPreRender(e);
}
protected override void CreateChildControls() {
Controls.Add(TreeView);
Controls.Add(fldCheckedNodes);
}
protected override void RenderContents(HtmlTextWriter output) {
TreeView.RenderControl(output);
fldCheckedNodes.RenderControl(output);
}
}
您的服务器端代码仅在对呈现控件的页面的调用期间触发(无论是在初始加载期间还是在PostBack期间)。
如果需要从隐藏字段PRIOR到PostBack的值,则需要使用客户端JavaScript进行工作。 例如,您可以在JavaScript中创建一个称为“ function CheckedNodesChanged”的函数,并通过在JavaScript中进行注册和事件监听器在其中工作。 输出将如下所示:
<input type="hidden" id="fldCheckedNodes" onchange="checkedNodesChanged();" />
可能有一种方法可以将其添加到控件的代码隐藏中。 就像是:
fldCheckedNodes.Attributes.Add("onchange", "checkedNodesChanged();");
您将必须创建checkedNodesChanged的有意义的胆量。
服务器端ValueChanged事件仅在PostBack期间在服务器上的Page生命周期内触发,并且它检测到该值不同于原始页面加载时的原始值或不同于ViewState存储在ViewState中的最后一个值后的值。时间。
也许此UpdateCheckedNodes是我指的“ checkedNodesChanged()”函数? 在这种情况下,只需打电话给我即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.