JQuery Ajaxを使用して、ページのデータの配列をMVCアクションに送信しようとしています。これが私の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を超える場合>エラー。
AjaxにPOST制限はありますか?どのサイズに設定することができますか?この機能が本当に必要です!助けてください!
私の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" });
}
_
更新:ソリューションが見つかりました
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仕様は投稿に特定のサイズ制限を課していません。ただし、使用しているWebサーバーまたはフォーム送信の処理に使用するプログラミングテクノロジによって異なります。
ASP.NET MVCでは、これを試すことができます:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1000000" />
</requestFiltering>
</security>
HTTP仕様では、POSTデータサイズの制限は定義されていません。
しかし、ASP.NET MVCを使用すると、couldになる可能性がありますPOST=データ制限。構成ファイル:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1000000" />
</requestFiltering>
</security>
[〜#〜] msdn [〜#〜] から:
リクエストのコンテンツの最大長をバイト単位で指定します。デフォルト値は30000000です。
[〜#〜] if [〜#〜]クライアント側の制限があり、ブラウザ固有の制限がありますが、HTTP仕様ではPOST =データサイズ。
POSTはネットワーク上の単なるバイトであるため、投稿するフィールドが多いほど、そのデータのアップロードにかかる時間が長くなることに注意してください。
1MB POSTは、従来のフォーム送信を使用している場合、フォームが壊れていて応答しないように感じさせます。
serialize()
に多くのフィールドがある場合、AJAXはすべてのデータを収集しているときにブラウザをハングアップさせる可能性があります。ブラウザはJavaScript全体のメモリ制限があると思いますその制限に達した場合、AJAXプロセスは失敗します。
// wanna have some fun?
var html = '<div></div>';
for(var i = 0; i < 1000000; i++){
html += html;
}
最善の策は、問題を回避するために、サーバー側の最大許容POSTサイズを増やすことです。
最も一般的な問題は、ユーザーが3 KBの写真が125 KB/sのアップロードリンクで遅くなる理由を混乱させながら、単にハングしているように見えるアップロードスクリプトを作成する場合に発生します。
これは私の問題を解決しました:
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483647" />
</webServices>
</scripting>
</system.web.extensions>
制限は、サーバー「max_post_size」または同様の名前付けによって設定されます。一般的なデフォルトのサーバー設定は、1つの投稿で2〜8 MBです。
クライアント側では、GETのみに最大制限があり、一般に1500バイト(リクエストヘッダーから30〜150を引いたもの)と見なされます。理由は、より低レベルのネットワークハードウェアのMTUです