En Mi código para guardar el pedido JSON que no golpea el controlador, tampoco aparece ningún error incluso en
Consola del navegador, solo recibo un Error: Order Not Complete!
Mi controlador:
public ActionResult SaveOrder([FromBody]string name, string address, Order[] order) { //var settings = new JsonSerializerSettings(); string result = "Error! Your Order Is Not Complete!"; try { if (name != null && address != null && order != null) { var cutomerId = Guid.NewGuid(); Customer model = new(); model.CustomerId = cutomerId; model.Name = name; model.Address = address; model.OrderDate = DateTime.Now; db.Customers.Add(model); foreach (var item in order) { var orderId = Guid.NewGuid(); Order O = new(); O.OrderId = orderId; O.ProductName = item.ProductName; O.Quantity = item.Quantity; O.Price = item.Price; O.Amount = item.Amount; O.CustomerId = cutomerId; db.Orders.Add(O); } db.SaveChanges(); result = "Successfully! Order Is Complete!"; } return Json(result); } catch (Exception) { throw; } }Y aquí está el código JavaScript:
function saveOrder(data) { return $.ajax({ contentType : 'application/json; charset=utf-8', dataType : 'json', type : 'POST', url : "/Orders/SaveOrder", data : data, success : function (result) { alert(result); location.reload(); }, error : function () { alert("Error!") } }); } //Collect Multiple Order List For Pass To Controller $("#saveOrder").click(function (e) { e.preventDefault(); var orderArr = []; orderArr.length = 0; $.each($("#detailsTable tbody tr"), function () { orderArr.push({ productName : $(this).find('td:eq(0)').html(), quantity : $(this).find('td:eq(1)').html(), price : $(this).find('td:eq(2)').html(), amount : $(this).find('td:eq(3)').html() }); }); var data = JSON.stringify({ name : $("#name").val(), address : $("#address").val(), order : orderArr }); $.when(saveOrder(data)).then(function (response) { console.log(response); }).fail(function (err) { console.log(err); }); });Estoy leyendo y buscando pero no pude encontrar ninguna diferencia en mi código o incluso sé mi error, es por eso que busco su ayuda, por favor.
Parece que está tratando de vincular los tres argumentos [FromBody]string name , string address y Order[] order al cuerpo JSON de su solicitud, pero como se explica en .NET Core Web API: ¿múltiples [FromBody]? solo puede tener un parámetro [FromBody] ya que el cuerpo solo se puede leer una vez.
En su lugar, cree un DTO de nivel superior correspondiente al JSON en su cuerpo y vincúlelo:
public class SaveOrderRequestModel { public string name { get; set; } public string address { get; set; } public Order[] order { get; set; } }y entonces
public ActionResult SaveOrder([FromBody] SaveOrderRequestModel saveOrderRequest) { string result = "Error! Your Order Is Not Complete!"; var (name, address, order) = (saveOrderRequest?.name, saveOrderRequest?.address, saveOrderRequest?.order); if (name != null && address != null && order != null) { // Proceed as beforeComo dijo @dbc, solo puede tener un parámetro [FromBody] ya que el cuerpo solo se puede leer una vez.
Creo que su error puede deberse al formato JSON incorrecto, el controlador no recibe los parámetros pasados por Ajax, puede verificar si su cuerpo Json es así cuando se pasa:
A continuación se muestra mi código de prueba, puede consultarlo:
Vista:
@model _2022072501.Models.OrderDTO <button id="saveOrder" class="btn btn-primary">submit</button> <script src="https://code.jquery.com/jquery-1.12.4.js" type="text/javascript"></script> <script> function saveOrder(data) { $.ajax({ contentType : 'application/json; charset=utf-8', dataType : 'json', type : 'POST', url : "/Home/SaveOrder", data : data, success : function (result) { alert(result); location.reload(); }, error : function () { alert("Error!") } }); } //Collect Multiple Order List For Pass To Controller $("#saveOrder").click(function (e) { e.preventDefault(); debugger; var orderArr = []; orderArr.push({ productName : "Test1", quantity : "Test1" }); orderArr.push({ productName : "Test2", quantity : "Test2" }); var data = JSON.stringify({ name : "testName", address : "testAdress", order : orderArr }); $.when(saveOrder(data)).then(function (response) { console.log(response); }).fail(function (err) { console.log(err); }); }); </script>Controlador:
public IActionResult SaveOrder([FromBody] OrderDTO orderDTO) { //var settings = new JsonSerializerSettings(); string result = "Error! Your Order Is Not Complete!"; var (name, address, order) = (orderDTO?.name, orderDTO?.address, orderDTO?.order); try { if (name != null && address != null && order != null) { foreach (var item in order) { var orderId = Guid.NewGuid(); Order O = new(); O.OrderId = orderId; O.ProductName = item.ProductName; O.Quantity = item.Quantity; //db.Orders.Add(O); } //db.SaveChanges(); result = "Successfully! Order Is Complete!"; } return Json(result); } catch (Exception) { throw; } } Puede cancelar su $.each como yo y cambiarlo a un valor fijo, tal vez sea más conveniente encontrar el problema