【发布时间】:2017-10-22 20:03:37
【问题描述】:
我希望我的 Edit All 按钮进行 ajax 调用以将 300 个项目发送到我的 jsonresult 控制器方法进行更新,但它根本没有到达我的端点,并且网络选项卡显示状态代码 302。似乎当我尝试发送一个或 10 个项目时,点击我的控制器方法并且工作正常,所以我猜这与 300 太多而无法传递有关?我附上了我的 html + javascript 函数 + ajax 调用 + 控制器方法的一部分。
我查看了其他答案,但它们似乎与登录身份验证或预期 302 的场景有关。还有一些帖子建议一次发送较小的数组,但我想先确定问题是否相关。
$scope.saveAllDays = function () {
var newValue = angular.element("#editAll").val();
var savedCustomers = [];
angular.forEach(angular.element(".customer"), function (customer, index) {
var currentCustomerId = angular.element(customer).attr("id");
for (var i = 0; i < $scope.customers.length; i++) {
if ($scope.customers[i].Id == currentCustomerId) {
var savedCustomer = $scope.customers[i];
savedCustomer.ArchiveDays = newValue;
savedCustomers.push(savedCustomer);
break;
}
}
})
console.log(savedCustomers);
$.ajax({
type: "PUT",
url: "/JobArchive/UpdateArchivePeriods",
data: JSON.stringify(savedCustomers),
contentType: "application/json",
dataType: "json",
success: onUpdateAllSuccess,
error: onUpdateAllError
})
}
<div id="archiveConfigTab" class="tab-pane fade">
<div class="bumper"></div>
<div class="container cust-body">
<div class="search">
<label>Search:</label>
<input type="text" id="nameInput" size="100" ng-model="customerName" />
</div>
<div id="customer-title">
Customers
</div>
<div id="editAllDays">
<p class="edit-all-btn pull-right">
<button class="btn btn-sm btn-default" ng-click="showEditAll($event)">Edit All <i class="fa fa-edit"></i></button>
</p>
<div class="edit-mode hidden">
<input type="number" id="editAll" placeholder="# of days" min="0" />
<button class="btn btn-sm btn-primary" ng-click="saveAllDays()">Save</button>
</div>
</div>
<div id="{{customer.Id}}" class="customer" ng-repeat="customer in customers | orderBy : 'Name' | filter : customerName">
<p class="cust-row">{{customer.Name}}</p>
<p class="cust-row pull-right">
<button class="btn btn-sm btn-default" ng-click="toggleInput($event)">edit <i class="fa fa-edit"></i></button>
</p>
<p>Archive Period: {{customer.ArchiveDays}} days</p>
<div class="edit-mode-row hidden">
<input type="number" ng-keypress="checkEnter($event, saveDays)" class="archivePeriod" placeholder="# of days" min="0" />
<button class="btn btn-primary btn-sm" ng-click="saveDays($event)">save</button>
</div>
</div>
</div>
<div class="bumper"></div>
</div>
[HttpPut]
public JsonResult UpdateArchivePeriods(List<LAG.Models.Customer> updatedCustomers)
{
List<ConfiguredCustomerViewModel> results = new List<ConfiguredCustomerViewModel>(); // Initialize List of stuff to return to front
foreach (var customer in updatedCustomers) // Loop through and update each
{
bool updateSuccess = LAG.API.DAL.CustomerRepository.GetRepository().SaveArchiveDays(customer.ArchiveDays, customer.Id);
if (updateSuccess)
{
ConfiguredCustomerViewModel result = new ConfiguredCustomerViewModel();
result.Id = customer.Id;
result.ArchiveDays = customer.ArchiveDays;
results.Add(result);
}
}
return Json(results);
}
【问题讨论】:
-
在你的 JsonResult 方法中放置一个断点,看看它是否被命中。我敢打赌不是这样,您需要查看其他地方,例如您的 Web 服务器配置,才能找到此错误的来源。
-
问题 - 这是底部的 c# 代码,对吗?您可能希望使用该标记,因为该代码更接近于发出 302 的任何系统。
-
@TimGrant 我的 JsonResult 方法中确实有一个断点,这就是我知道我的 ajax 调用适用于较小的数组大小但不适用于我想要的全部 300 个的方式。我将尝试修剪我试图传递的对象,看看是否有效。刚刚加了c#标签,谢谢!
-
好的,这就是证明。当请求有效负载很大时,API Web 服务器上的其他东西会阻止您的代码运行。也许但不一定是因为大请求已损坏。
-
@TimGrant 我修剪了每个对象,只包含我真正需要的两个属性,并且成功进入数据库。我有点担心它不适用于更大的物体,因为我知道我将来可能需要这样做。您是否碰巧知道 Web 服务器是否通常会使用更大的有效负载进行重定向?
标签: javascript c# ajax http-status-code-302 jsonresult