【问题标题】:Possible solution to UpdatePanel and ClientIDMode="Static"UpdatePanel 和 ClientIDMode="Static" 的可能解决方案
【发布时间】:2012-12-06 13:21:13
【问题描述】:

我一直在到处寻找解决 Asp.NET 中静态 ClientIDMode + UpdatePanel 的方法,如 http://connect.microsoft.com/VisualStudio/feedback/details/584991/clientidmode-static-in-updatepanel-fails-to-do-async-postback 中所示

问题出在 Sys.WebForms.PageRequestManager.uniqueIDToClientID 函数中,该函数通过将“$”字符替换为“”将名称转换为 id。 我做了一个似乎有效的修复,但我希望你们告诉我你的想法以及我是否遗漏了什么。非常感谢!

var old_uniqueIDToClientID = Sys.WebForms.PageRequestManager.prototype._uniqueIDToClientID;
Sys.WebForms.PageRequestManager.prototype._uniqueIDToClientID = function (arg) {
    var element = this._form.elements[arg];
    return (element) ? element.id : old_uniqueIDToClientID(arg)
}

【问题讨论】:

    标签: asp.net updatepanel


    【解决方案1】:

    我们进行了类似的修复,但我们更改了另一个与搜索导致回发的元素有关的函数。

    我们在母版页底部放置了以下代码,以确保在 scriptmanager 加载其脚本后将其包含在内。本质上,它一直在修改 id,直到找到导致回发的元素。原始代码通过从由美元符号分隔的名称右侧删除标记来搜索元素。所以“$ctl00$ddl001”会变成“$ctl00”。如果您使用的是静态 ID,那么该后缀可能永远不会存在。我们将函数修改为从左侧开始并删除容器名称,直到找到一个元素。

    它现在似乎对我们有用。 :)

       if (Sys.WebForms.PageRequestManager) {
            var prm = Sys.WebForms.PageRequestManager.getInstance();
            prm._findNearestElement = function (uniqueID) {
            while (uniqueID.length > 0) {
                var clientID = this._uniqueIDToClientID(uniqueID);
                var element = document.getElementById(clientID);
                if (element) {
                    return element;
                }
                var indexOfFirstDollar = uniqueID.indexOf('$', 1);
                if (indexOfFirstDollar === -1) {
                    return null;
                }
                uniqueID = uniqueID.substring(indexOfFirstDollar + 1, uniqueID.length);
            }
            return null;
        };
    }
    

    【讨论】:

      【解决方案2】:

      要在异步模式下工作的更新面板,您需要在表单中添加脚本管理器标签。

      <asp:ScriptManager EnablePartialRendering="true"
       ID="ScriptManager1" runat="server"></asp:ScriptManager>
      

      或者你可以添加触发器

      <Triggers>
           <asp:AsyncPostBackTrigger ControlID="ddl_Manufacturer" EventName="SelectedIndexChanged" />
      </Triggers>
      

      【讨论】:

        猜你喜欢
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 2020-04-09
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        相关资源
        最近更新 更多