2

jQueryオートコンプリートを使用するオートコンプリートドロップダウン用のASP.Net(VB.Net)カスタムコントロールを作成しようとしています。

基本的なフローは、コントロールのコンシューマーがいくつかのプロパティ(データソースなど)を設定し、オートコンプリートを初期化するために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持つ1つのプロパティが表示されます。必要なのは、の値が(文字列としてではなく)であるため、URLであると考えるオートコンプリートではなく、オートコンプリートのコールバックとして実行できるようにすることです。source"testFunc"sourcetestFunc

4

1 に答える 1

0

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

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

これにより、テキストが前に付いた引用符で囲まれた文字列を探し、その"source":中身をキャプチャしてグループ#1をキャプチャします。次に、一致全体を内部テキストに置き換え、コールバック関数の名前のいずれかの側から引用符を効果的に削除します。

于 2012-05-02T19:59:51.747 に答える