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

Ajax请求ASP.NET Core MVC接口接收对象始终为null问题求助

解决思路

1. 补全必填字段,解决模型验证失败问题

你的Products实体类里标记了多个[Required]属性,但Ajax请求只传了3个字段,ImageName、UserId、Category这些必填项完全缺失。ASP.NET Core的模型绑定会因为验证不通过,直接返回null对象。

要么临时去掉这些字段的[Required]特性(仅用于测试),要么在Ajax里补全所有必填字段的有效值,比如:

var Data = {
    ProductId: "输入一个合法的Guid字符串",
    ProductName: ProductName,
    ProductPricd: ProductPrice,
    ImageName: "测试图片名.jpg",
    UserId: "当前用户的ID值",
    Category: { CategoryId: $("#Categories").val() } // 假设Category实体有CategoryId属性
};

2. 修正字段拼写不一致问题

注意到你第二次尝试的Ajax里写的是ProductPrice,但实体类的属性是ProductPricd(末尾是d不是e),字段名拼写不匹配会导致该字段绑定失败,甚至影响整个模型的绑定结果,必须保证前后端字段名完全一致。

3. 处理Category导航属性的绑定逻辑

实体类里的Category是ProductsCategories类型的导航对象,前端直接传下拉框的选中ID值,无法直接绑定到对象。有两种解决方式:

  • 后端改用CategoryId字段接收(和实体类的ForeignKey对应),而非直接接收ProductsCategories对象;
  • 前端构造符合ProductsCategories结构的对象,比如Category: { CategoryId: $("#Categories").val() },让后端能正确解析。

4. 改用DTO接收请求(推荐方案)

直接用数据库实体类接收前端请求不合理,实体类包含很多和请求无关的属性(比如IFormFile、导航属性),且必填字段限制会干扰绑定。建议专门创建一个DTO类:

public class ProductSubmitDto
{
    public string ProductName { get; set; }
    public decimal ProductPricd { get; set; }
    public int CategoryId { get; set; } // 假设CategoryId是int类型
    public string UserId { get; set; }
    public string ImageName { get; set; }
    // 只保留前端需要传递的字段
}

后端方法修改为:

[HttpPost]
public async Task<IActionResult> SubmitProduct([FromBody] ProductSubmitDto productDto)
{
    // 后续再把DTO转成Products实体类,补充其他字段
    return Content("OK");
}

前端只需要传递DTO对应的字段,避免不必要的字段干扰绑定。

5. 针对文件上传调整请求方式

如果需要上传ProductImage(IFormFile类型),不能用JSON格式请求,必须改用multipart/form-data,用FormData对象传递:

var formData = new FormData();
formData.append("ProductName", $("#ProductName").val());
formData.append("ProductPricd", $("#ProductPrice").val());
formData.append("CategoryId", $("#Categories").val());
formData.append("ProductImage", $("#ProductImage")[0].files[0]);
// 补充其他必填字段...

$.ajax({
    type: "POST",
    url: "/Products/SubmitProduct",
    contentType: false, // 不要手动设置,让浏览器自动处理
    processData: false, // 不要处理FormData
    data: formData,
    success: function (data) {
        alert("Success");
    },
    error: function (data) {
        console.log(data);
    }
});

这种情况下后端要用[FromForm]接收,DTO里包含IFormFile字段。

6. 查看模型绑定错误,快速定位问题

在后端方法里添加模型状态检查,能直接看到绑定失败的原因:

[HttpPost]
public async Task<IActionResult> SubmitProduct([FromBody] Products product)
{
    if (!ModelState.IsValid)
    {
        var errors = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage);
        return BadRequest(string.Join("; ", errors));
    }
    return Content("OK");
}

然后在前端的error回调里打印data.responseText,就能看到具体的验证错误信息,比盲目排查高效得多。


内容的提问来源于stack exchange,提问作者mohammad awwad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:25:57