Сначала я хотел бы поместить код инициализации dataTable.
Ниже приведена инициализация Datatable, которая выполняется, когда элемент управления переходит в свойство success другого вызова ajax. В частности, этот вызов Ajax предназначен только для отправки данных в хранимую процедуру. (Я поставлю код также). Я удалил весь ненужный код.
function initializeDataTable(data) {
$('#tblDiscount').DataTable().clear();
$('#tblDiscount').DataTable().destroy();
var table= $('#tblDiscount').DataTable({
serverSide: true, // true
processing: true,
responsive:true,
ordering: false, // false
searching: false, // false
lengthChange: false, // pagesize
paging: true,
deferRender:true,
footer: true,
columnDefs: [{ targets: [14, 16, 17], className: 'dt-body-right' },
{ targets: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15], classname: 'dt-body-left' }
],
//searching: true,
dom: 'frBtip',
async: false,
ajax: function (data, callback, settings) {
var skip = 0;
if (data.start == 0)
skip = 0;
else
skip = data.start + 50; //data.length;
$.ajax({
url: '../Reports/_GetOnScrollData',
data: {
skipRows: skip,
limit: 50 //data.length
},
datatype: "Json",
async: false,
success: function (dataset) {
for (var i = 0; i < dataset.res.length; i++) {
out.push([dataset.res[i].state, dataset.res[i].zone, dataset.res[i].amro,
dataset.res[i].StoreCode, dataset.res[i].OfferType, dataset.res[i].DiscountType,
dataset.res[i].OfferNo, dataset.res[i].Description, dataset.res[i].ReceiptNo, dataset.res[i].TransDate,
dataset.res[i].Category, dataset.res[i].ItemCode, dataset.res[i].LotNo, dataset.res[i].ExpirationDate,
dataset.res[i].Quantity, dataset.res[i].FreeItem, dataset.res[i].NetValue, dataset.res[i].Discount]);
}
},
error: function (jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 500) {
alert('Internal error: ' + jqXHR.responseText);
} else {
alert('Please revise your FILTER selection as the \n' +
'information You are fetching has more than 1 lac Records');
location.reload(true);
}
} //error closed
}).done(function (response) {
callback(
{
draw: data.draw,
data: out,
recordsTotal: parseInt(countRecords),
recordsFiltered: parseInt(countRecords)
});
}).fail(function (err) {
console.error('error...', err)
})
}, //end of ajax call for controller
scrollY: 500, // div height
scrollX: true,
scroller: {
loadingIndicator: true
},
footerCallback: function (row, data, start, end, display) {
var api = this.api()
var json = api.ajax.json();
$(api.column(17).footer()).html(totalOfDiscount);
$(api.column(16).footer()).html('Total:' + totalOfNetValue);
$(api.column(14).footer()).html('Total:' + totalOfQuantity);
}
}); //end of ajax call for scroller
}
Теперь, что касается метода действия контроллера:
public ActionResult _GetOnScrollData(int skipRows, int limit)
{
List<DiscountGrid> res = new List<DiscountGrid>();
try
{
if (skipRows == 0)
{
Session["TotalList"] as List<DiscountGrid>=res
res = res.Skip(skipRows).Take(limit).ToList();
}
else if(skipRows!=0)
{
res = Session["TotalList"] as List<DiscountGrid>;
res = res.Skip(skipRows).Take(limit).ToList();
}
}
catch (SqlException ex)
{
throw ex;
}
return Json(res,JsonRequestBehavior.AllowGet);
}
Итак, насколько хороши записи 1k или 10k. Это отображается в таблице данных. Но как только число записей выходит за пределы 50 КБ, поток управления выполнения вместо перехода к свойству успеха получает попадание в свойство ошибки вызова ajax.
Вызов, который переходит к / controller = Reports / Action = _GetOnScrollData. Я понятия не имею, что вызывает эту проблему. Я перепробовал много вариантов и перестановок. Я даже уменьшил вызов ajax в вышеупомянутой функции до одного (убрал следующее).
$.ajax({
url: '../Reports/_GetOnScrollData',
data: {
skipRows: skip,
limit: 50 //data.length
},
Я задал вопрос однажды назад, что делают эти data.draw и обратный вызов. Если вы посмотрите на пример Аллана (DataTable Forum) по обработке на стороне сервера 5 000 000 записей, я увидел эту строку:
ajax: function (data, callback, settings)
Я подумал, что она имеет какое-то другое значение. Поэтому я подумал, что мне нужно будет вложить ajax, чтобы убедиться, что вызов поступает на контроллер. Я только что сослался на этот пример и, честно говоря, сделал это, не понимая, что я делаю? Итак, я вложил ajax call.
Дело в том, что я просто хочу, чтобы данные загружались на Scroll, независимо от того, будет ли это число записей 50 КБ или 5 МБ. Данные JSON, которые я получаю от контроллера, проблем нет (M хорошо с MVC). Так что мне делать? Должен ли я удалить вложенный ajax? Должен ли я удалить пропустить и взять концепт из MVC кода? Если так, как мой код будет отображать данные вместе с нижним колонтитулом (нижний колонтитул мне нужен для отображения общего количества целочисленных столбцов)?
Обновление
В приложении указан формат, в котором поступают данные из метода действия контроллера.