如何从表单提交将产品和数量传递给ASP.NET MVC4 Web API
ASP.NET MVC4应用程序允许输入订购的产品数量并将它们传递给Web API控制器。
控制器接收空产品列表作为产品参数。 调试器显示数据已发布。 如何重构视图以便产品可以传递给Web API?
视图:
@inherits ViewBase @using (Html.BeginForm()) { @for (int i = 0; i < Model.Products.Count; i++) { @Model.Products[i].Id @Html.HiddenFor(m => Model.Products[i].Id) @Html.TextBoxFor(m => Model.Products[i].Quantity, new { @class="quantity", type = "number", min = 0 }) }
@Html.HiddenFor(m => Model.CustomerId) } $(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 productIdElement = $(element).prevAll()[0]; elementsToSend.push(productIdElement); elementsToSend.push(element); }); var dataToPost = $(elementsToSend).serializeArray(); $.post(BASE_URL + "api/Order?" + $.param({ klient: $("#CustomerId").val() }), dataToPost); }); })
视图模型:
public class MobileOrderOrderViewModel : ViewModelBase { public string CustomerId { get; set; } public List Products { get; set; } public MobileOrderOrderViewModel( string customer ) { CustomerId = customer; ... populate Products property from database } }
模型:
public class OrderedItems { public string Id; public decimal Quantity; }
WebAPI控制器:
public class OrderController :ApiController { public HttpResponseMessage Post(string customerid, [FromBody]List products) { // Why products.Count() is 0 here ? ... } }
更新
我根据答案更改了代码。 alert()显示字符串采用answer中描述的格式,但products参数仍为空。
chrome显示请求类型是
内容类型:应用/ X WWW的窗体-urlencoded;
但缓冲区包含json字符串。 也许这会混淆Web API。 怎么修 ?
$.each(quantityElements, function (index, element) { var productIdElement = $(element).prevAll()[0]; var product = { id: $(productIdElement).val(), quantity: $(element).val() }; elementsToSend.push(product); }); var dataToPost = JSON.stringify(elementsToSend); $.post(BASE_URL + "api/Order?" + $.param({ customerid: $("#CustomerId").val() }), dataToPost);
问题出在数据序列化上。
为了正确绑定,必须采用以下格式:
"products" : [ {"id":1, "quantity":20}, {"id":5, "quantity":100}, ... ]
在您的情况下,以下代码产生错误的输出:
$.each(quantityElements, function (index, element) { var productIdElement = $(element).prevAll()[0]; elementsToSend.push(productIdElement); elementsToSend.push(element); });
如果我没有错,它会产生如下:
[ {name:"id[1]", value:1}, {name:"quantity[1]", value:20} {name:"id[2]", value:5}, {name:"quantity[2]", value:100} ... ]
您可以通过以下方式解决此问题:
$.each(quantityElements, function (index, element) { var productIdElement = $(element).prevAll()[0]; var product = { id : $(productIdElement).val(), quantity : $(element).val() }; products.push(product); });
而不是serializeArray()
使用JSON.stringify(products)
UPDATE
尝试将其发布到服务器:
$.post(BASE_URL + "api/Order?" + $("#CustomerId").val(), products);
PS在这种情况下,您不必对stringify
产品对象,因为.$post
支持普通对象