You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:13:16