填充嵌套ViewModel时出现Null值问题
解决嵌套ViewModel出现Null值的问题
我来帮你分析下嵌套ViewModel获取到Null值的常见原因和对应解决办法,结合你给出的模型代码来看:
首先先把你的模型代码整理补全(补充了PerspectivaRealViewModel的占位结构):
public class VMDetallePeriodoPAgo { public DetallePeriodoPagoViewModel Modelo1 { get; set; } public PerspectivaRealViewModel Modelo2 { get; set; } } public class DetallePeriodoPagoViewModel { public int ID { get; set; } public int IdRecibo { get; set; } public string Descripcion { get; set; } public int IdPeriodoPago { get; set; } public string Empleado { get; set; } public decimal Ingresos { get; set; } public decimal MontoISR { get; set; } } public class PerspectivaRealViewModel { // 这里是你的自定义属性定义 }
常见原因及解决办法
未初始化嵌套属性
C#中引用类型的属性默认是Null,当你实例化VMDetallePeriodoPAgo时,Modelo1和Modelo2不会自动创建实例,这是最常见的触发原因。
解决办法有两种:- 声明属性时直接初始化:
public class VMDetallePeriodoPAgo { public DetallePeriodoPagoViewModel Modelo1 { get; set; } = new DetallePeriodoPagoViewModel(); public PerspectivaRealViewModel Modelo2 { get; set; } = new PerspectivaRealViewModel(); } - 在构造函数中初始化:
public class VMDetallePeriodoPAgo { public DetallePeriodoPagoViewModel Modelo1 { get; set; } public PerspectivaRealViewModel Modelo2 { get; set; } public VMDetallePeriodoPAgo() { Modelo1 = new DetallePeriodoPagoViewModel(); Modelo2 = new PerspectivaRealViewModel(); } }
- 声明属性时直接初始化:
赋值/绑定时未创建嵌套实例
如果是手动给ViewModel赋值,或者在前端表单/API请求绑定数据时,没有正确处理嵌套对象,也会导致Null。- 后端手动赋值时,要先实例化嵌套对象再设置属性:
var vm = new VMDetallePeriodoPAgo(); // 先实例化Modelo1再赋值属性 vm.Modelo1 = new DetallePeriodoPagoViewModel { ID = 1, IdRecibo = 1001, Descripcion = "月度薪资明细", // 其他属性按需赋值 }; - 如果是前端表单提交,要使用正确的命名格式(比如
Modelo1.IdRecibo),这样ASP.NET的ModelBinder才能正确识别并创建嵌套实例。
- 后端手动赋值时,要先实例化嵌套对象再设置属性:
序列化/反序列化配置问题
如果是通过API接收JSON数据,若JSON中没有包含嵌套对象的结构,或者序列化工具的配置忽略了空对象,也会导致嵌套属性为Null。
解决办法:确保传入的JSON包含嵌套对象的结构,或者调整序列化配置。比如用System.Text.Json时:var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.Never }; var vm = JsonSerializer.Deserialize<VMDetallePeriodoPAgo>(jsonString, options);
如果你的问题是在特定框架(比如ASP.NET Core MVC、Blazor等)中出现的,可以补充更多场景细节,我能帮你更精准地排查~
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

