7

我一直在寻找解决 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)
}
4

2 回答 2

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;
    };
}
于 2013-03-22T19:17:56.987 回答
0

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

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

或者您可以添加触发器

<Triggers>
     <asp:AsyncPostBackTrigger ControlID="ddl_Manufacturer" EventName="SelectedIndexChanged" />
</Triggers>
于 2016-04-27T07:17:12.797 回答