c# - 通过 Javascript 更改时,HiddenField EventHandler ValueChanged 不会触发

标签 c# asp.net javascript events hidden-field

我有一个在 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);
  }

}

最佳答案

您的服务器端代码仅在调用呈现控件的页面期间触发 - 无论是在初始加载期间还是在回发期间。

如果您需要在回发之前隐藏字段中的值,那么您需要在客户端 JavaScript 中完成工作。例如,您可以在 JavaScript 中创建一个名为“function checkNodesChanged”的函数,并通过在 JavaScript 中注册事件监听器来在其中进行工作。输出需要如下所示:

<input type="hidden" id="fldCheckedNodes" onchange="checkedNodesChanged();" />

可能有一种方法可以将其添加到控件的代码隐藏中。像这样的东西:

fldCheckedNodes.Attributes.Add("onchange", "checkedNodesChanged();");

您必须创建 checkNodesChanged 的​​有意义的内容。
服务器端 ValueChanged 事件仅在回发期间服务器上的页面生命周期期间触发,并且它检测到该值不同于原始页面加载的原始值或上次回发时存储在 ViewState 中的最后值。时间。

也许这个 UpdateCheckedNodes 就是我指的“checkedNodesChanged()”函数?在这种情况下,只需调用它而不是我所拥有的。

关于c# - 通过 Javascript 更改时,HiddenField EventHandler ValueChanged 不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1064036/

相关文章:

c# - 如何通过 $.ajax() 发布到 ASP.NET WEB API?

javascript - 取消输入时提交

c# - Sitecore 在 SavedItemRemoteEvent 上出错还有其他人吗?

javascript - 使用 Ctrl-C 退出时,Node.js 调试器是否发送 SIGINT/SIGTERM?

javascript - 迭代多个数组元素

c# - WPF MVVM 防止选项卡更改

c# - 带有 CosmosDBTrigger 的 Azure 函数似乎不是由 upsert 触发的

C# 如何在多线程中使用 MemoryStream

c# - 如何以编程方式更改对象数据源的选择方法?

javascript - 检查子节点的样式