7

http://connect.microsoft.com/VisualStudio/feedback/details/584991/clientidmode-static-in-updatepanel-failsに見られるように、Asp.NET の静的な ClientIDMode + UpdatePanel の解決策を探していました。-to-do-async-postback

問題は Sys.WebForms.PageRequestManager にあります。"$" 文字を " " に置き換えて名前を id に変換する uniqueIDToClientID 関数。動作しているように見える修正を行いましたが、皆さんの考えと、何か不足している場合は教えていただきたいです。どうもありがとう!

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 に答える