0

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);

これは、静的に配置されたコントロールでは機能しますが、動的に追加されたコントロールでは機能しません。スクリプトがソース ビューに表示されないだけです。

4

1 に答える 1

0

スクリプトをコード ビハインドに移動すると、静的な5 引数バージョンの RegisterStartupScript が呼び出されたときに機能します。UserControl 自体を最初のパラメーターとして指定します。

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(); }";    
ScriptManager.RegisterStartupScript(this, this.GetType(), aceItemSearch.ClientID + "_getItemByID", searchScript, true);
于 2013-08-06T19:14:18.287 に答える