.NET 8中Fetch发送嵌套列表至控制器时数据为空求助
问题原因
核心问题是后端模型定义与前端发送的数据结构不匹配:
- 后端
ClientesVM类中的Preguntas属性是单个NegPreguntaDTO对象 - 但前端发送的
Preguntas是包含多个问题对象的数组(preguntasRespondidas是数组)
这种结构不匹配会导致ASP.NET Core的模型绑定失败,最终控制器接收的vm对象为空。
解决方案
根据业务需求,有两种修正方式:
方式一:修改后端模型支持多个问题(推荐)
如果业务需要提交多个问题答案,将ClientesVM中的Preguntas属性改为列表类型,并在构造函数中初始化:
using Aplicacion.DTOs; using Dominio.Models; using Microsoft.AspNetCore.Mvc.Rendering; using System.Collections.Generic; namespace WebApp.ViewModels { public class ClientesVM { public ClientesVM() { DDLTiposRespuesta = new SelectList(new List<string>()); DDLTiposDocumento = new SelectList(new List<string>()); Preguntas = new List<NegPreguntaDTO>(); // 初始化列表避免空引用 } // 其他原有属性保持不变 // 修改为列表类型 public List<WebApp.ViewModels.NegPreguntaDTO> Preguntas { get; set; } public SelectList DDLTiposRespuesta { get; set; } public SelectList DDLTiposDocumento { get; set; } } }
方式二:修改前端发送单个问题对象(仅适用于单问题业务场景)
如果业务只需要单个问题答案,调整前端代码将数组改为单个对象:
// 仅获取单个select的值,去掉循环逻辑 let pregunta = { Id: 1, Respuesta: $('#FRMResponderPreguntas select').find('option:selected').val() || 'default_value' }; let data = { 'IdentificadorSesion': sesionVerificacion, 'Preguntas': pregunta // 发送单个对象而非数组 };
额外验证点
- 确认前端JSON属性名称与后端模型属性完全匹配(你的示例中
Id和Respuesta大小写一致,无问题) - 控制器的
[FromBody]特性已正确添加(你的代码中已配置,无需修改) - 可在控制器中添加日志排查模型绑定错误:
[HttpPost] public async Task<JsonResult> GetHTMLVerificacion([FromBody] ClientesVM vm) { var success = true; try { if (!ModelState.IsValid) { var errors = ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage)); Console.WriteLine(string.Join("; ", errors)); } } catch (Exception ex) { success = false; Console.WriteLine(ex.Message); } return Json(new { success }); }
内容的提问来源于stack exchange,提问作者Juan Erroa
相关产品推荐
相关产品推荐

