0

サーバーから大量のデータを受信し、それをJson形式に変換してJqGridで表示するという問題があります。たとえば200行などの少量のデータで機能しますが、10000行でこれを行うと、次のエラーがスローされます

System.InvalidOperationException: JSON JavaScriptSerializer を使用したシリアル化または逆シリアル化中にエラーが発生しました。文字列の長さが maxJsonLength プロパティで設定された値を超えています

javascript シリアライザーを使用して maxjsonLenght = int32.MaxValue に設定してみましたが、まだうまくいきません

以下は私のコードです。これを修正する方法の例を教えてください。皆さんありがとう!

GridConfig

 public JqGridConfig(String db, String jobGroup, String jobName, String detailTable,       String filterBatchControl, String filterDate, String filterTime, int page)
    {
        var entityhelper = new EntityHelper();
        var s = new JsonSerializer();

        try
        {
            //Populate Grid Model, Column Names, Grid Column Model, Grid Data
            entityhelper.PopulateDetailGridInit(db, jobGroup, jobName, detailTable, filterBatchControl, filterDate, filterTime);

            JqGridDetailAttributes = entityhelper.GridDetailAttributes;
            JqGridDetailColumnNames = entityhelper.GridDetailColumnNames;
            //JqGridDetailsColumnNamesForExport = entityhelper.GridDetailColumnNamesForExport;
            JqGridDetailColumnModel = entityhelper.GridDetailColumnModel;

            //Dynamic Data
            JqGridDynamicDetailData = entityhelper.GridDetailData;


            #region Column Model
            foreach (KeyValuePair<String, JqGridColModel> kvp in entityhelper.GridDetailColumnModel)
            {
                s.Serialize(kvp.Key, kvp.Value.Attributes);
            }

            JqGridDetailColumnModelJson = s.Json();
            #endregion

            #region Concrete data.  1. List<dynamic> populated, 2. Convert to Json String, 3: Convert back to List<Detail>
            JqGridDetailData = JsonSerializer.ConvertDynamicDetailsToJson(JqGridDynamicDetailData); // this is where the error occurs

            }
        catch (Exception ex)
        {
            //TODO: Logging
            System.Diagnostics.Debug.WriteLine(ex.Message);
        }
    }

Json シリアライザー

  public static IList<Detail> ConvertDynamicDetailsToJson(IList<dynamic> list)
    {
        if (list.Count == 0)
            return new List<Detail>();

        var sb = new StringBuilder();
        var contents = new List<String>();

        sb.Append("[");

        foreach (var item in list)
        {
            var d = item as IDictionary<String, Object>;

            sb.Append("{");
            foreach (KeyValuePair<String, Object> kvp in d)
            {    
                contents.Add(String.Format("{0}: {1}", "\"" + kvp.Key + "\"", JsonConvert.SerializeObject(kvp.Value))); 
            }
            sb.Append(String.Join(",", contents.ToArray()));
            sb.Append("},");
        }

        sb.Append("]");

        //remove trailing comma
        sb.Remove(sb.Length - 2, 1);
        var jarray = JsonConvert.DeserializeObject<List<Detail>>(sb.ToString());

        return jarray;
    }

サーバーから Json の結果を返すコントローラー

  public JsonResult DetailGridData(TheParams param)
    {






        dynamic config= "";
        switch (param.JobGroup)
        {
            case "a":
                config = new BLL.abcBLL().GetDetailGridData("rid", "desc", 1, 20, null,
                                                                             param.FilterBatchControl,
                                                                             param.JobName, param.DetailTable,
                                                                             param.JobGroup, param.BatchDate,
                                                                             param.Source);
                break;
        }




        return Json(config, JsonRequestBehavior.AllowGet);  // this reurns successfully json result
    }

Jqgrid が存在し、グリッドに入力されていない場所を表示します

 <script type="text/javascript">

var jobGroup = '@ViewBag.JobGroup';
var jobName  = '@ViewBag.JobName';
var detailTable = '@ViewBag.DetailTable';
var filterBatchControl = '@ViewBag.FilterBatchControl';
var controlDate = '@ViewBag.ControlDate';
var controlTime = '@ViewBag.ControlTime';
var source = '@ViewBag.DetailSource';
var page = '@ViewBag.page';



function loadDetailData() {
    var param = new Object();
    param.BatchDate = controlDate;
    param.BatchTime = controlTime;
    param.JobGroup = jobGroup;
    param.JobName = jobName;
    param.DetailTable = detailTable;
    param.FilterBatchControl = filterBatchControl;
    param.Source = source;
    param.page = page;

    window.parent.loadingDetailsHeader();        

    $.ajax({
        url: "/control/detailgriddata",
        dataType: 'json',
        type: 'POST',
        data: param,
        async: false,
        success: function (response) {
            try {
                jgGridDetailColumnNames = response.JqGridDetailColumnNames;
                //jqGridDetailColumnData = response.JqGridDetailData;
                jqGridDetailColumnData = response.config;
                $('#detailGrid').jqGrid('setGridParam', {colNames: jgGridDetailColumnNames});
                $('#detailGrid').jqGrid('setGridParam', {data: jqGridDetailColumnData}).trigger('reloadGrid');
                parent.loadingDetailsHeaderComplete();
            }
            catch(e) {
                window.parent.loadingDetailsHeaderException(e.Message);
            }
            return false;
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    });
}

function exportdetails(date) {
    var param = new Object();
    param.db = source;
    param.jobGroup = jobGroup;
    param.jobName = jobName;
    param.detailTable = detailTable;
    param.filterBatchControl = filterBatchControl;          
    param.filterDate = date;
    param.filterTime = "NULL";

    $.ajax({
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        url: '@Url.Action("ExportDetailsCsv", "Control")',
        dataType: 'json',
        data: $.toJSON(param),
        async: false,
        success: function (response) {
            window.location.assign(response.fileName);
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert("Details Export Exception: " + xhr.status);
        }
    });
}

//<![CDATA[
$(document).ready(function () {
    'use strict';

    $(window).resize(function () {
        $("#detailGrid").setGridWidth($(window).width());
    }).trigger('resize');

    var dgrid = $("#detailGrid");

    $('#detailGrid').jqGrid('clearGridData');
    loadDetailData();

    dgrid.jqGrid({
        datatype: 'json',
        data: jqGridDetailColumnData,
        colNames: jgGridDetailColumnNames,
        colModel: [ @Html.Raw(@ViewBag.ColModelDetail) ],
        rowNum: 25,
        rowList: [25, 50, 100],
        pager: '#detailPager',
        gridview: true,
        autoencode: false,
        ignoreCase: true,
        viewrecords: true,
        altrows: false,
        autowidth: true,
        shrinkToFit: true,
        headertitles: true,
        hoverrows: true,
        height: 300,
        onSelectRow: function (rowId) {
            //This is a demo dialog with a jqGrid embedded
            //use this as the base for viewing detail data of details
            //$('#dialogGrid').dialog();
            //gridDialog();
        },
        loadComplete: function (data) {},
        gridComplete: function (data) {
            //if (parseInt(data.records,10) < 50) {
            $('#detailPager').show();
            //} else {
            //$('#detailPager').show();
            //}
        }
    }).jqGrid('navGrid', '#detailPager', { edit: false, add: false, del: false, search: false }, {});
});
 //]]>
 </script>
 <table id="detailGrid">
<tr>
    <td />
</tr>
</table>

 <div id="detailPager"></div>

 <div id="dialogGrid"></div>
4

1 に答える 1

0

おそらく、クライアントに 10000 行を返す代わりに、サーバー側のページングを使用することを検討する必要がありますか? サーバー側の SQL データのページングは​​、クライアント側のページング (JavaScript プログラムでのインデックス付けされていない大きなデータの並べ替え)よりもはるかに効果的に実装できます。

もう 1 つのオプションは、別のJSON シリアライザーを使用することです。たとえば、protobuf-netServiceStack.Text (こちらも参照)、Json.NETなどです。と比較して、アプリケーションのパフォーマンスをさらに向上させることができますJavaScriptSerializer

于 2013-01-09T17:41:13.113 に答える