Ответ 1
JSON имеет максимальную длину! Мне нужно увеличить эту ценность. В web.config добавьте следующее:
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>
Я пытаюсь отправить массив данных с моей страницы на действие MVC с помощью jQuery Ajax. Вот мой код jQuery:
$('#btnSave').click(
function () {
result = [];
$('#tblMatters tbody tr.mattersRow').each(function () {
if (!($(this).hasClass('warning'))) {
var item = {};
if ($(this).find('td.qbmatter > div.dropdown').length > 0) {
item.QBDescription = $(this).find('td.qbmatter > div.dropdown > a').text();
} else {
item.QBDescription = $(this).find('td.qbmatter').text();
}
var id = $(this).find("td:first > a").text();
item.Narrative = $("#collapse" + id).find("div.scrollCell").text();
item.WorkDate = $(this).find('td.workDate').text();
item.Hours = $(this).find('td.hours').text();
item.Person = $(this).find('td.person').text();
if ($(this).find('td.rate > div.dropdown').length > 0) {
item.Rate = $(this).find('td.rate > div.dropdown > a').text();
} else {
item.Rate = $(this).find('td.rate').text();
}
item.Amount = $(this).find('td.amount').text();
result.push(item);
}
});
var originalRecords = $("#tblSummary tr.summaryTotalRow td.summaryOriginalRecords").text();
var originalHours = $("#tblSummary tr.summaryTotalRow td.summaryOriginalHours").text();
var excludedHours = $("#tblSummary tr.summaryTotalRow td.summaryExcludedHours").text();
var totalHours = $("#tblSummary tr.summaryTotalRow td.summaryTotalHours").text();
$.ajax({
url: "/Home/SaveQBMatter",
type: "POST",
data: JSON.stringify({ 'Matters': result, 'originalRecords': originalRecords, 'originalHours': originalHours, 'excludedHours': excludedHours, 'totalHours': totalHours }),
dataType: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
success: function (data) {
if (data.status == "Success") {
alert("Success!");
var url = '@Url.Action("Index", "Home")';
window.location.href = url;
} else {
alert("Error On the DB Level!");
}
},
error: function () {
alert("An error has occured!!!");
}
});
});
Позвольте мне немного пояснить. У меня есть таблица HTML, которая была построена динамически, и мне нужно сохранить эти данные в базе данных. В jQuery у меня есть цикл, проходящий через таблицу, и я храню данные каждой строки в массиве result
. Затем я передаю эти данные с помощью Ajax в действие MVC.
И вот здесь начинается моя проблема... Я понял, что иногда это происходит так, как должно быть, но иногда я получаю сообщение об ошибке Ajax alert("An error has occured!!!");
Теперь я понял, что эта ошибка возникает, когда массив result
становится большим. Например: если он содержит 100-150 элементов> все хорошо, но когда есть более ~ 150> Ошибка.
Есть ли предел POST в Ajax? Как я могу настроить его для любых размеров? Мне действительно нужна эта функциональность! Любая помощь пожалуйста!
Мой код ActionResult:
public ActionResult SaveQBMatter(QBMatter[] Matters, string originalRecords, string originalHours, string excludedHours, string totalHours) {
DBAccess dba = new DBAccess();
int QBMatterID = 0;
int exportedFileID = 0;
foreach (QBMatter qb in Matters) {
dba.InsertQBMatter(qb.QBDescription, qb.Narrative, qb.WorkDate, qb.Person, qb.Hours, qb.Rate, qb.Amount, ref QBMatterID);
}
ExcelTranslator translator = new ExcelTranslator();
translator.CreateExcelFile("", Matters, originalRecords, originalHours, excludedHours, totalHours);
return Json(new { status = "Success", message = "Passed" });
}
UPDATE: найдено решение
JSON имеет максимальную длину! Мне нужно увеличить эту ценность. В web.config добавьте следующее:
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>
JSON имеет максимальную длину! Мне нужно увеличить эту ценность. В web.config добавьте следующее:
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>
Это какой-то лимит POST в Ajax?
Нет, спецификация HTTP не налагает ограничение по размеру для сообщений. Однако это зависит от используемого вами веб-сервера или технологии программирования, используемой для обработки отправки формы.
В ASP.NET MVC вы можете попробовать следующее:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1000000" />
</requestFiltering>
</security>
Спецификация HTTP не определяет ограничение размера данных POST.
Но используя ASP.NET MVC, может быть ограничение данных POST, попробуйте увеличить его в файле Web.Config:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1000000" />
</requestFiltering>
</security>
Из MSDN:
Задает максимальную длину содержимого в запросе в байтах. Значение по умолчанию - 30000000.
ЕСЛИ существует ограничение на стороне клиента, тогда он будет специфичным для браузера, но спецификация HTTP не определяет ограничение размера данных POST.
Имейте в виду, что POST - это всего лишь байты по сети, поэтому чем больше полей вы отправляете, тем дольше может потребоваться загрузить эти данные.
1 МБ POST собирается заставить пользователя почувствовать, что форма нарушена и не отвечает, если вы используете традиционную форму submit.
Если есть много полей для serialize()
то AJAX может повесить браузер, когда он собирает все данные. Я думаю, что у браузеров есть предел памяти для JavaScript, поэтому, если вы нажмете этот предел, процесс AJAX завершится неудачно.
// wanna have some fun?
var html = '<div></div>';
for(var i = 0; i < 1000000; i++){
html += html;
}
Лучше всего увеличить максимально допустимый размер POST на стороне сервера, чтобы избежать проблем.
Чаще всего проблемы возникают, когда люди создают сценарий загрузки, который просто кажется зависающим, пока пользователь путается, почему их снимки 3 МБ идут медленно на ссылку загрузки 125 КБ/с.
Предел устанавливается через сервер "max_post_size" или аналогичное именование. Типичные настройки сервера по умолчанию - 2-8 МБ в одном сообщении.
На стороне клиента только GET имеет максимальный предел, обычно считается 1500 байт (минус 30-150 от заголовков запросов), и причина в MTU в более низкоуровневом сетевом оборудовании