.NET Core MVC中ModelBinder抛出NullReferenceException问题咨询
问题原因与解决方案
为什么GetExtensionWithoutPoint会被调用?
ASP.NET Core的模型验证系统在模型绑定完成后,会自动遍历模型类的所有公共属性(包括只读属性),尝试访问它们的值以完成验证流程。你的GetExtensionWithoutPoint是MyFile类的公共只读属性,因此会被ValidationVisitor访问到。
而表单提交时,你只传递了MyFile.Id和MyFile.State两个字段,Extension并没有被包含在POST数据中,模型绑定后Extension的值为null。当验证系统访问GetExtensionWithoutPoint的getter时,执行Extension.Substring(1)就会直接抛出NullReferenceException,导致后续的SaveEdit方法根本没机会执行。
解决方法
方法1:给只读属性添加空值保护
修改GetExtensionWithoutPoint的getter,处理Extension为null的情况:
public string GetExtensionWithoutPoint { get { return Extension?.Substring(1) ?? string.Empty; } }
方法2:标记属性跳过验证
用[ValidateNever]特性告诉模型验证系统忽略这个属性:
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; // ... [ValidateNever] public string GetExtensionWithoutPoint { get { return Extension.Substring(1); } }
方法3:拆分视图模型(推荐)
将用于展示的属性和用于提交的属性拆分到不同的视图模型中。提交用的视图模型只包含需要的字段,避免验证系统接触到不需要的只读属性:
// 展示用模型 class MyFileDisplayViewModel { public MyFile MyFile {get; set;} // 其他展示用属性 } // 提交用模型 class MyFileEditViewModel { public int Id {get; set;} public MyState State {get; set;} }
然后修改控制器的SaveEdit方法接收MyFileEditViewModel,视图也对应调整表单字段。
内容的提问来源于stack exchange,提问作者SuperNev
相关产品推荐
相关产品推荐

