我一直在寻找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)
}
答案 0 :(得分: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;
};
}
答案 1 :(得分:0)
要在异步模式下工作的updatepanel,您需要在表单中添加scriptmanager标记。
<asp:ScriptManager EnablePartialRendering="true"
ID="ScriptManager1" runat="server"></asp:ScriptManager>
或者您可以添加触发器
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddl_Manufacturer" EventName="SelectedIndexChanged" />
</Triggers>