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
相关产品推荐
相关产品推荐

