2012-12-06 30 views
3

我一直在到处寻找一个解决方案,以静态的ClientIDMode +的UpdatePanel在Asp.NET,为http://connect.microsoft.com/VisualStudio/feedback/details/584991/clientidmode-static-in-updatepanel-fails-to-do-async-postback可能的解决方案的UpdatePanel和的ClientIDMode =“静态”

的问题是在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) 
} 

回答

5

我们做了类似的修复,但我们改变了另一个涉及搜索引起回发的元素的函数。

我们已将以下代码放置在母版页的底部,以确保在脚本管理器加载脚本后包含它。从本质上讲,它不断修改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; 
    }; 
} 
0

updatepanel以异步模式工作,您需要在窗体中添加scriptmanager标记。

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

,或者你可以添加触发器

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