Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

174
Views
Json no golpea el controlador

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.

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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 before
about 4 years ago · Santiago Trujillo Report

0

Como 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:

ingrese la descripción de la imagen aquí

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

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!