1

ac#.net MVC アプリケーションがあります。jQuery UI オートコンプリートを使用しています。オートコンプリートに送信する有効な JSON 文字列を作成し、次のようにビューに追加しました。

$(document).ready(function() {
    autoCompleteParams[@Model.Id] = jQuery.parseJSON(@Html.Raw(Json.Encode(Model.ParamValueListJson)));
    // Handles onchange for autocomplete
    $reports.initParamList('@Model.Id');
});

の値を確認しParamValueListJsonて検証を実行するJSONと、有効な文字列です。ただし、とても長いです。Wordに貼り付けると98ページ、424,638文字(スペース含む)。

特に結果の値をチェックするビューに返された html を見ると、文字数が 31,424 に減少したことがわかります。切り捨てられてJSONいるため有効ではなく、「Uncaught Syntax Error: Unexpected String」というエラーが表示されます

返されるレコードを制限すると、すべてが再び機能します。しかし、私はそれを行うことはできません。オプションとしてすべての値が必要です。

これを処理する最善の方法は何ですか? 完全なJSON文字列がビューに返されるようにすることはできますか? オートコンプリート用のオブジェクトを作成する別の方法はありますか? または、人為的に の長さを制限してからJSON、結果をビューに結合する必要がありますか?

これに関する任意の助けをいただければ幸いです。これまでのところ、Google 検索は役に立ちませんでした。

アップデート

少し詳しく見てみると、文字列全体がビューに渡されていることがわかります。AJAX 呼び出しで返されるデータには、完全な文字列が含まれています。ただし、それが実行jQuery.parseJSONされると、切り捨てられます。

更新 2

"値文字列の 1 つにある を削除すると、すべて期待どおりに機能します。どうやら文字列が切り捨てられていないようdataです。開発者ツールに表示されるパラメーターが完全な文字列を表示していなかっただけです。

4

2 に答える 2

1

長い文字列を使用する必要があるかどうかは、良い質問です (回答する必要があります) が、別のトピックです。

私の経験では、「Uncaught Syntax Error: Unexpected String」エラーが発生した場合、文字列にエスケープされていない文字が含まれているため失敗します (例: '";:)。

短い文字列が機能することを考えると、おそらくそれは無効な文字を含む完全な結果の末尾にあるレコードの 1 つです。

表示されている切り捨ては、JSON 文字列のサイズの制限ではなく、ブラウザでの文字列へのアクセス方法の結果である可能性があります。完全な文字列がそこにあるという最後の更新を考えると、パーサーに送信された文字列は切り捨てられていないと推測します。

文字列全体を注意深く見て、値にエスケープされていない文字がないかどうかを確認することをお勧めします。

于 2013-11-07T12:41:08.877 に答える
1

一度に何千ものレコードを表示することはできません。千を返す理由はありません。jQuery UI Web サイトで示されているように、オートコンプリートが独自に ajax 呼び出しを行うようにします。

サーバー側の ajax エンドポイントが結果セットを適切なものにフィルター処理することを確認してください.. 20 ~ 25 レコードなど。

いくつかのヒント: MVC コントローラー メソッドは、View ではなく JsonResult を返す必要があります。また、必ず HttpGet を許可するように JsonResult を設定してください (JsonResult オブジェクトのプロパティとして)。

このようなもの(VB、しかしあなたはそれを理解することができます):

$('#txtSearchTerms').autocomplete({
    source: function (request, response) {
        $.ajax({
            url: '@Context.Request.Url.Scheme://@Context.Request.Url.Host:@Context.Request.Url.Port/Ajax/ProductSearch/' + $('#txtSearchTerms').val(),
            dataType: 'json',
            data: {},
            success: function (data) {
                response($.map(data, function (item) {
                    return {
                        label: iitem.Name,
                        value: item.ProductID,
                        id: item.ProductID
                    }
                }))     //  response
            }           //  success
        })              //  ajax
    }                   //  source function
});

<HttpGet>
Public Function ProductSearch(term As String) As JsonResult
  Dim payload As SomeModel = Nothing
  Using database As WebDataContext = New WebDataContext
    database.Configuration.CreateProxies = False
    payload = (From p In database.Products Where p.Name.Trim.ToLower.StartsWith(term.Trim.ToLower) Select p).Take(25).ToList
  End Using

  Return New JsonResult With {.Data = payload, .JsonRequestBehavior = JsonRequestBehavior.AllowGet}
End Function
于 2013-11-07T00:06:59.907 に答える