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

Asp.NET MVC问题:POST请求中DTO传递至控制器时为NULL的原因排查

问题分析与解决方案

你遇到的这个问题核心原因很明确:你的CreateReservationDTO类里的成员是公共字段(field),而非带getter/setter的属性(property),ASP.NET Core默认的JSON反序列化机制只处理属性,所以即使请求返回200状态码,控制器也无法正确解析请求体中的数据。

为什么单独传单个对象或列表能正常工作?

看一下你提供的VirtualPCDTO和其他相关DTO,它们的成员都是标准的属性(比如public string Name { get; set; }),序列化框架可以正常识别并处理这些属性。而CreateReservationDTO用的是字段(比如public int ReservationId;),没有访问器,所以反序列化时会被忽略,导致控制器接收的对象全是默认值。

快速解决方案:将字段改为属性

只需要给CreateReservationDTO的每个成员加上{ get; set; },把字段改成属性即可:

public class CreateReservationDTO { 
    public int ReservationId { get; set; }
    public DateTime ReservationFromDate { get; set; }
    public DateTime ReservationToDate { get; set; }
    public DateTime ReservationTimeStamp { get; set; }
    public string ReservationIp { get; set; }
    public List<VirtualPCDTO> VirtualPCs { get; set; }
}

修改后重新测试请求,控制器里的data参数应该就能正确接收到所有传递的值了。

可选方案:配置序列化框架支持字段

如果你因为某些原因必须使用字段,也可以通过配置序列化选项来开启字段的反序列化支持:

对于System.Text.Json(ASP.NET Core默认)

在Program.cs中添加如下配置:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 开启字段的序列化与反序列化
        options.JsonSerializerOptions.IncludeFields = true;
    });

对于Newtonsoft.Json(如果你使用了这个库)

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver
        {
            IncludeFields = true
        };
    });

不过更推荐使用属性的方案,这是.NET中DTO的标准写法,符合序列化框架的默认行为,也能避免额外配置带来的潜在兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:52:50