HTML5离线ASP.NET MVC4应用程序允许进入订单数量和客户提交订单。
在浏览器中呈现的产品列表中包含约4000产品。 只有极少数产品订购特定的顺序。
使用以下请求超时代码。 浏览帖子的所有产品。 请求花费太多的时间和很可能是由的httpRuntime ExecutionTimeout终止
Server错误日志显示,所有发布的数据被接收。 它看起来像MVC模型绑定需要太多的时间来从发布的数据产品列表。
如何解决这一问题? 如何发布仅订购的商品,其数量被输入或其他的想法? 我可以切换到阿贾克斯,jQuery和MVC4的Web API,如果这是合理的。
控制器:
public class OfflineOrderController : ControllerBase
{
[HttpGet]
public ActionResult Order(string customerId)
{
return View(new MobileOrderOrderViewModel(customerId));
}
[HttpPost]
public ActionResult Order(string customerId, [Bind(Prefix = "Products")] IEnumerable<OrderedItems> Result)
{
... save order to database
return new ContentResult() { Content = "Order received" };
}
public AppCacheResult Manifest()
{
return new AppCacheResult(new[] {
Url.Content("~/Image/Icon/favicon")
});
}
}
视图:
<!DOCTYPE html>
<html manifest="~/MobileOrder/Manifest">
<body>
@using (Html.BeginForm())
{
<table>
@for (int i = 0; i < Model.Products.Count; i++)
{
<tr>
<td>@Model.Products[i].Id</td>
<td>
@Html.HiddenFor(m => Model.Products[i].Id)
@Html.TextBoxFor(m => Model.Products[i].Quantity,
new { type = "number", min = 0 })
</td>
</tr>
}
</table>
<input type="submit" value="Send order">
@Html.HiddenFor(m => Model.CustomerId)
}
</body>
</html>
视图模型:
public class MobileOrderOrderViewModel : ViewModelBase
{
public string CustomerId { get; set; }
public List<OrderedItems> Products { get; set; }
public MobileOrderOrderViewModel( string customer ) {
CustomerId = customer;
... populate Products property from database
}
}
模型:
public class OrderedItems
{
public string Id;
public decimal Quantity;
}
UPDATE2
从Imrans使用代码回答我创建API控制器收到订购的产品:
public class OrderController :ApiController
{
public HttpResponseMessage Post(string customerid, [FromBody]List<OrderedItems> products) {
....
}
}
调试器显示的产品发布,但产品参数为空表。 如何通过选择产品列表,网络API?
用于邮政代码是:
<script>
$(function () {
"use strict";
var BASE_URL = '@Url.Content("~/")';
$("form").submit(function (ev) {
var elementsToSend = [];
ev.preventDefault();
var quantityElements = $("input.quantity").filter(function (index, element) {
if ($(this).val() != 0) {
return true;
}
else {
return false;
}
});
$.each(quantityElements, function (index, element) {
var productIndex = $(element).prevAll()[1];
var productIdElement = $(element).prevAll()[0];
elementsToSend.push(productIndex);
elementsToSend.push(productIdElement);
elementsToSend.push(element);
});
var dataToPost = $(elementsToSend).serializeArray();
$.post(BASE_URL + "api/Order?" + $.param({
customerid: $("#CustomerId").val()
}), dataToPost);
return false;
});
})
</script>