AjaxControlToolkit の AutoCompleteExtender を含む UserControl を作成しました。同じページに静的に設計されたインスタンスが 1 つ以上ある場合にうまく機能します。ただし、これらのコントロールの 1 つが動的に (たとえば、UpdatePanel 内に) 追加された場合、その 1 つのコントロールの<script>
ブロック (現在、ソース ビューに埋め込まれている) は使用できないようです (JavaScript は、見つからないと文句を言います)。 OnClientItemSelected に配線している関数)。
UserControl のスクリプトを PreRender イベントに登録する必要があると思われるため、ページに動的に追加された場合でも使用できます。私は ToolkitScriptManager を使用しており、ScriptManager.RegisterScriptControl(this);
自分のコントロールから呼び出す必要があると想像してから、IScriptControl インターフェイスを実装します。
これは正しいアプローチですか?その場合、IScriptControl を正しく実装するには、スクリプト ブロックをソース ビューから独自の .js ファイルに移動する必要がありますか? その特定のインスタンス内のサブコントロールの ClientID を取得するためにインライン コードを呼び出すため、JS 関数を再設計する必要があります。
var hiddenField = $get('<%=this.hfItemID.ClientID%>');
スクリプト管理と JS は私の専門ではないので、プログラムで追加を開始するまでうまく機能していた UserControl を複雑にする前に、それが正しい方向であることを確認したいと思います。
アップデート
JavaScript をコード ビハインドに移動し、ClientScript として登録しています。これにより、必要な場所に少し近づくことができます。
string searchScript = "function " + this.aceItemSearch.ClientID + "_getByID(sender, e) { var hfield = $get('" + this.hfItemID.ClientID + "'); if (typeof hfield === 'undefined') return; var item = eval('(' + e._value + ')'); hfield.value = item.ID; if (typeof document != 'undefined') { var control = $get('" + this.btnSearch.ClientID + "'); } control.click(); }";
Page.ClientScript.RegisterStartupScript(this.GetType(), aceItemSearch.ClientID + "_getByID", searchScript, true);
これは、静的に配置されたコントロールでは機能しますが、動的に追加されたコントロールでは機能しません。スクリプトがソース ビューに表示されないだけです。