Estoy haciendo una solicitud AJAX POST al controlador (ASP.NET Core MVC), pero el valor del parámetro aparece como nulo. Probé varias soluciones dadas en StackOverflow. Pero, no pude corregirlo. Por favor ayuda.
Mi vista recopila información sobre las tarifas de las clases. Puede haber más de un pago.
$(function () { $('#sendSlip').click(function (e) { e.preventDefault(); let fees = new Array(); //To store payment info let tb = $('#feesTable:eq(0) tbody'); //Collecting info of each payment tb.find("tr").each(function () { let row = $(this); let fee = {}; if (row.find('input:checkbox:first').is(':checked')) { fee.ClassId = row.find("TD").eq(0).html(); fee.FeeId = row.find("TD").eq(1).html(); fee.Amount = row.find(".fee").html(); fee.Month = row.find(".month").html(); fees.push(fee); } }); //Arranging data to send to controller var data = { fees: fees, Bank: $(".bank").val(), PaidAmount : $(".amount").val(), PaidDate : $(".date").val() }; console.log(data); $.ajax({ type: 'POST', url: '@Url.Action("StudentPayment_Create", "StudentPayment")', contentType: "application/json", headers: { 'RequestVerificationToken': gettoken() }, data: //{ data: JSON.stringify(data) }, JSON.stringify(data) , }) }); });Modelo
public class StudentPaymentSlipVM { public StudentPaymentPaidClassVM fees { get; set; } public string Bank { get; set; } public DateTime PaidDate { get; set; } public int PaidAmount { get; set; } }Controlador
public ActionResult StudentPayment_Create([FromBody] List<StudentPaymentSlipVM> data) { --- }De su captura de pantalla adjunta para que los datos se transfieran al controlador, la estructura de los datos no coincidía con el modelo de datos que esperaba el controlador.
Suponga que la estructura de datos para el front-end es correcta .
El controlador debe esperar que los datos recibidos sean un objeto StudentPaymentSlipVM . Mientras que en el objeto StudentPaymentSlipVM , las fees son una matriz StudentPaymentPaidClassVM .
Modelo
public class StudentPaymentSlipVM { public List<StudentPaymentPaidClassVM> fees { get; set; } public string Bank { get; set; } public DateTime PaidDate { get; set; } public int PaidAmount { get; set; } }Controlador
public ActionResult StudentPayment_Create([FromBody] StudentPaymentSlipVM data) { }Desde su parte de JQuery, asegúrese de que su objeto de datos que se pasará a la API debe coincidir con el tipo de datos como su modelo en el back-end.
var data = { fees: fees, Bank: $(".bank").val(), PaidAmount : parseInt($(".amount").val()), PaidDate : $(".date").val() };Traté de pasar mis datos al controlador al vincularme a un ViewModel (StudentPaymentSlipVM) que tiene todas las definiciones requeridas. Pero no pude hacerlo. Así que cambié la forma y pasé mi objeto al Controlador de la siguiente manera, ahora está funcionando. Y también me gustaría agradecer a Yong Shun.
$.ajax({ type: 'POST', url: '@Url.Action("action", "controller")', headers: { 'RequestVerificationToken': gettoken() }, data: dataObj, }) [HttpPost] public ActionResult StudentPayment_Create(List<StudentPaymentPaidClassVM> Fees, string Bank, decimal PaidAmount, DateTime PaidDate) { ..... }