ASP.NET控制器接收JSON对象时属性为空的现代解决方案求助
ASP.NET控制器接收JSON对象时属性为空的现代解决方法
我尝试将JSON对象发送到ASP.NET控制器,但对象属性始终为空。请求负载已经发送,但数据绑定失败。网上找到的解决方案大多是10年前的,需要现代的解决办法。
我的模型
public class Expenses { public int Id { get; set; } public int Month { get; set; } public int Week { get; set; } public int CategoryId { get; set; } [ForeignKey("CategoryId")] public Category category { get; set; } public float Amount { get; set; } public string Date { get; set; } public string Description { get; set; } }
JS中创建的对象
// 创建对象 let expense = { id: "listOrder" + listOfExpensesCounter, Month: formData.month, Week: formData.week, Type: category[0], Amount: formData.amount === "" ? 0 : formData.amount, Date: formData.date === "" ? getCurrentDate() : formData.date, Description: formData.description }
AJAX调用代码
function ajaxCall(expense) { const obj = JSON.stringify(expense); $.ajax({ url:'/Expenses/Create', contentType: 'application/json; charset=utf-8', type: "Post", data: obj, dataType: "json", success: function (data) {}, error: function (error) {} }); }
控制器代码
[HttpPost] public async Task<IActionResult> Create(Expenses expense) { try { Expenses newExpense = new Expenses { Month = expense.Month, Week = expense.Week, CategoryId = expense.CategoryId, Amount = expense.Amount, Date = expense.Date, Description = expense.Description }; _db.expensesRepository.Add(newExpense); _db.Save(); return this.Ok($"hello world"); } catch (Exception e) { return this.Ok($"hello world error"); } }
现代解决步骤
1. 新增参数绑定特性
ASP.NET Core中,接收JSON格式POST请求时,必须给参数加上[FromBody]特性,明确告知框架从请求体读取数据:
[HttpPost] public async Task<IActionResult> Create([FromBody] Expenses expense) { // 原有业务逻辑不变 }
2. 修正JS对象的属性匹配问题
C#模型中需要CategoryId字段,但JS对象里写的是Type,这会直接导致该属性绑定失败;另外建议统一属性大小写(ASP.NET Core默认不区分大小写,但统一后更稳妥):
let expense = { Id: "listOrder" + listOfExpensesCounter, // 改为与模型一致的大写Id Month: formData.month, Week: formData.week, CategoryId: category[0], // 替换Type为CategoryId,对应模型字段 Amount: formData.amount === "" ? 0 : parseFloat(formData.amount), // 确保转为数字类型 Date: formData.date === "" ? getCurrentDate() : formData.date, Description: formData.description }
3. 验证请求格式
在浏览器开发者工具的Network标签中,确认请求的Content-Type为application/json; charset=utf-8,同时检查Payload的JSON格式是否正确,没有语法错误。
4. 调试绑定错误(可选)
如果问题仍存在,可在控制器中检查模型状态,输出绑定错误信息:
[HttpPost] public async Task<IActionResult> Create([FromBody] Expenses expense) { if (!ModelState.IsValid) { var errors = ModelState.SelectMany(x => x.Value.Errors).Select(e => e.ErrorMessage); return BadRequest(errors); } // 原有业务逻辑不变 }
内容的提问来源于stack exchange,提问作者T-Bone
相关产品推荐
相关产品推荐

