UpdatePanel和ClientIDMode ="静态"的可能解决方案

Jor*_*rez 5 asp.net updatepanel

我一直在寻找Asp.NET中静态ClientIDMode + UpdatePanel的解决方案,如http://connect.microsoft.com/VisualStudio/feedback/details/584991/clientidmode-static-in-updatepanel-fails中所示-to-DO-异步回发

问题出在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)
}
Run Code Online (Sandbox Code Playgroud)

小智 5

我们做了类似的修复,但是我们改变了另一个涉及搜索导致回发的元素的函数.

我们在主页的底部放置了以下代码,以确保在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;
    };
}
Run Code Online (Sandbox Code Playgroud)