2

jQuery auto-completeを使用する自動補完ドロップダウンのASP .Net(VB.Net)カスタムコントロールを作成しようとしています。jqueryオートコンプリートAPIを模倣するWebサーバーコントロールを作成

基本的な流れは、コントロールのコンシューマーがいくつかのプロパティ(データソースなど)を設定し、オートコンプリートを初期化するためのjavascriptとして注入されます。

多くの部分が含まれているので、コードの一部を投稿していない可能性があります。何かが不足していると思われる場合はコメントしてください。

の背後にある消費者のコード(PREINITイベント):

myDropDown.DataCallback = "testFunc"; 

制御でDataCallbackプロパティ:

Public Property DataCallback As String 

オプションは、オブジェクト作成し、背後にある制御コード内のJavaScriptインジェクション(PreRenderイベント) :

Dim _serializer As New JavaScriptSerializer() 
Dim optionsObject As New Dictionary(Of String, Object) 
optionsObject.Add("source", DataCallback) 
Dim optionsJSON = _serializer.Serialize(optionsObject) 

Dim initializeScript = String.Format("initialize('{0}', {1});", ClientID, optionsJSON) 
Attributes.Add("onfocusin", initializeScript) 

、最終的には、Javascript:

var initialize = function (controlID, options) { 
    if (options) { 
     $('#' + controlID).autocomplete(options); 
    } 

    // remove the blur event handler that called this initialize function 
    $('#' + controlID).removeAttr('onfocusin'); 
}; 

私はinitialize関数にデバッグするとき、私はoptionsはそれが価値だと文字列"testFunc"で、一つの特性、sourceを持って参照してください。私が必要としているのは、sourceの値がtestFunc(文字列ではありません)であるため、オートコンプリートではなく、自動補完でコールバックとして実行できます。

+0

'_serializer'の型を知ることは役に立ちます。あなたが 'DataContractJsonSerializer'を使用している場合、' optionsObject'がjQuery UI用の有用なJSONオブジェクトに正しくシリアル化されるという方法はありません。また、データ・コールバック関数名を引用符で囲んで文字列からオブジェクト参照に変換する必要があります。 – lsuarez

+0

_serializerは( 'System.Web.Script.Serialization'の)' JavaScriptSerializer'です。この情報で質問を更新しました。 – jbabey

答えて

0

これを修正する最も簡単な方法は、パターン認識を使用することです。文字列プロパティが文字列としてシリアル化され、引用符で囲まれているため、問題が発生します。代わりに、オブジェクト参照を表すことをお勧めします。つまり、これらの引用符を取り除くことを意味します。引用符を削除するには、シリアライズされたオブジェクトの文字列に適用することができます単純な正規表現があります:

Dim optionsJSON = _serializer.Serialize(optionsObject) 
optionsJSON = Regex.Replace(optionsJSON , "(?<=""source"":)""(.+?)""", "$1") 

これはグループ#を捕獲するために内部に何のテキスト"source":とキャプチャが先行引用符で囲まれた文字列を探しているでしょう1。その場合、その一致全体を内部のテキストに置き換え、コールバック関数の名前のいずれかの側から引用符を効果的に削除します。

+0

あなたのご意見ありがとうございます、私は現在、javascript側で関数名を 'eval'することで似たようなことをしていますが、このアプローチはより洗練されているかもしれません。しばらくの間、より良いソリューションが掲載されていない場合は、これを可能な限り最良の方法として受け入れます。 – jbabey

+0

@jbabey変数名を参照しようとしていることを 'JavaScriptSerializer'に示す方法はありません。いずれにしても、スクリプトやコードで文字列操作を行います。もう一つ考慮すべきことは、実行時にその変数が有効範​​囲内にあるかどうかです。もう1つの選択肢は、クライアントスクリプトでデータソースを設定するのではなく、データバインドされたコントロールとして機能させるようにコントロールを再構成することです。これは、最初からコントロールを作成する場合に使用するアプローチです。 – lsuarez

関連する問題