Таблица данных JQuery, передавая большую строку JSON - PullRequest
0 голосов
/ 05 мая 2018

У меня есть таблица данных jQuery, и я использую ajax для ее заполнения. Данные из таблицы данных C # преобразуются в строку JSOn в API веб-метода, а результат передается в таблицу данных. Это работает нормально, когда у меня есть несколько тысяч строк данных, но если у меня есть что-то вроде 100 000 строк, я получаю ошибку памяти. Я искал эту проблему и пытался реализовать некоторые предложения, но это не сработало. Я не верю, что у меня есть круговая ссылка, потому что (я думаю) в этом случае даже тот, у которого меньше данных, потерпит неудачу. Вот что у меня есть (пока), где в ответ на нажатие кнопки отправки заполняется таблица данных:

var tblFacCert = $("#tblFacCert").DataTable({
    jQueryUI: true,
    data: [],
    dom: 'lfrtip',
    processing: true,
    stateSave: true,
    ....
});

$("#btnSubmit").on("click", function (event) {
    var facCertUrl = "../services/easg.asmx/GetComplianceReportData";
    var facCertParams = "{ 'startDate': '" + $("#tbStartDate").val() + "', 'certID': '" + $('#ddlCertificate').val() + "'}";
    populteTable(facCertUrl, facCertParams, tblFacCert);
})

function populteTable(ws_url, parameters, table) {
    $.ajax({
        type: "POST",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        url: ws_url,
        cache: false,
        data: parameters,
    }).done(function (result) {
        table.clear().draw();
        table.processing = true;
        jResult = JSON.parse(result.d);
        table.rows.add(jResult).draw();
    }).fail(function (jqXHR, textStatus, errorThrown) {debugger
        alert(textStatus + ' - ' + errorThrown); <--- Here I can see the following error thrown
    });
}
// Error: 
Exception of type 'System.OutOfMemoryException' was thrown.
StackTrace: 
at System.Text.StringBuilder.ToString() 
at System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, 
SerializationFormat serializationFormat) 
at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams) 
at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)
ExceptionType:System.OutOfMemoryException


[WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]

public string GetComplianceReportData(string startDate, string certID)
{
    DateTime dtStartDate = Convert.ToDateTime(startDate);
    int iCertItemID = int.Parse(certID);
    DataTable dt = FacCompliance.GetFacCompliances(dtStartDate, iCertItemID);
    string JSONresult;
    JSONresult = JsonConvert.SerializeObject(dt);

    /* I tried this, as was suggested in a post, no luck */

    //StringBuilder sb = new StringBuilder();
    //StringWriter sw = new StringWriter(sb);

    //using (JsonWriter writer = new JsonTextWriter(sw))
    //{
    //    var serializer = new JsonSerializer();
    //    serializer.Serialize(writer, dt);
    //}

    return JSONresult;
}

другое предложение, изменение web.config:

<configuration>
    <appSettings>
        ....
        <add key="aspnet:MaxJsonDeserializerMembers" value="500000"/>
    </appSettings>

<system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647"/>
        </webServices>
    </scripting>
</system.web.extensions>

Я также попытался добавить «serevrSide: true» для инициализации рассказа данных, но получаю эту ошибку, если я сделаю это:

"Unhandled exception at line 36, column 442 in https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js
0x800a138f - JavaScript runtime error: Unable to set property 'data' of undefined or null reference"
...