2013-11-27 56 views
14

我想使用jQuery Ajax将我的页面中的数据数组发送到MVC Action。这里是我的jQuery代码:Ajax中的POST数据大小是否有限制?

$('#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 Action。

这里是我的问题开始的地方......我意识到有时候它应该是这样,但有时我从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" }); 
} 

UPDATE:找到一个解决办法

JSON的最大长度!我需要增加这个值。在web.config中添加以下内容:

<appSettings> 
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" /> 
</appSettings> 
+0

错误的原因是别的。使用Firebug /使用Visual Studio的断点看到你真正的问题是什么 – Shyju

+0

您将需要返回代码从调试警报的/ dev-工具 – mschr

+0

Guuys最低。请。我仍然需要帮助! – Bryuk

回答

20

JSON的最大长度!我需要增加这个值。在web.config中添加以下内容:

<appSettings> 
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" /> 
</appSettings> 
+0

它已经在我的网页配置,但仍然得到长度错误超过当我传递json数据到控制器。我通过了600多个名单。 – SPnL

+0

@SPnL尝试更大的价值... – Bryuk

+0

已经有更大的价值。它是_2147483647_但仍然出现错误。 – SPnL

3

它是在阿贾克斯任何POST限制?

不,HTTP规范不对帖子强加特定的大小限制。但是,它取决于您正在使用的Web服务器或用于处理表单提交的编程技术。

在ASP.NET MVC你可以试试这个:

<system.webServer> 
<security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="1000000" /> 
    </requestFiltering> 
</security> 
+0

那么,什么可能是问题的原因? – Bryuk

+0

@Bryuk: - 真的很难说实话,因为可能有很多原因。我建议你使用任何调试器来检查实际的问题,但通过你的标题行没有这种限制在POST中的Ajax –

+0

在调试器显示我POST 500内部服务器错误 – Bryuk

0

的限制是通过服务器的max_post_size'或类似的命名设置。一篇文章中典型的默认服务器设置为2-8 MB。

在客户端,只能获得具有最大极限,一般认为1500个字节(减去从请求头30-150)和原因是MTU在更低层网络硬件

3

HTTP规范没有按”定义POST数据大小的限制。

但使用ASP.NET MVC,还有可能是一个POST数据的限制,试着提高它在你的web.config文件:

<system.webServer> 
<security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="1000000" /> 
    </requestFiltering> 
</security> 

MSDN

指定请求中的最大内容长度,以字节为单位。 默认值是30000000。

+0

无论如何,我出现错误,我甚至没有进入操作,所以它是100%ajax ... – Bryuk

+0

使用您的浏览器调试器/分析器。 –

1

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大小以避免问题。

最常见的问题出现时,人们作出一个上传脚本,只是似乎挂起,而用户是困惑,为什么他们3MB的图片会一个125KB/s的上传链接缓慢。

+0

“你最好的选择是增加服务器端的最大允许POST大小” - 你能帮忙做到这一点=)我真的需要这个... – Bryuk

+0

不幸的是我是一个PHP开发人员,所以Yair Nevet或Rahul Tripathi的文章是你最好的选择。我怀疑邮政大小是你的问题说实话。您的AJAX调用可能存在许多错误或格式错误的情况。如果可能的话,我建议发布包含在你的'/ Home/SaveQBMatter'页面的代码,因为500错误是指服务器的问题。 – MonkeyZeus

+0

如果你想看到一个超级基础和彻底的AJAX的例子,那么请访问我的答案在这里:http://stackoverflow.com/questions/20150130/ajax-and-php-to-enter-multiple-forms-input - 到数据库/ 20150474#20150474 – MonkeyZeus

相关问题