2012-12-06 53 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>