ASP.NET MVC中控制器访问itemCheck时出现NullReferenceException的原因
解决System.NullReferenceException: Object reference not set to an instance of an object.
这个空引用错误的核心原因很明确:在你的POST Action里,m.ItemList是null,所以当你尝试访问它的itemCheck属性时就会抛出异常。
为什么会出现这个问题?
ASP.NET MVC的模型绑定机制在处理POST请求时,会自动创建CategoryItemViewModel的实例,但它不会自动初始化ViewModel里的引用类型属性(比如ItemList,它是Item类型,属于引用类型)。虽然你的视图里生成了ItemList.itemCheck的表单字段,但模型绑定无法凭空创建一个Item实例来承载这个值——除非你提前给ItemList分配了实例。
解决方案
最优雅且一劳永逸的办法是在CategoryItemViewModel的构造函数里初始化它的引用类型属性:
public class CategoryItemViewModel { // 添加构造函数,初始化两个引用类型属性 public CategoryItemViewModel() { ItemList = new Item(); CategoryList = new Category(); } public Item ItemList { get; set; } public Category CategoryList { get; set; } }
这样,当模型绑定创建CategoryItemViewModel实例时,ItemList和CategoryList都会被自动初始化为对应的实例,表单提交的ItemList.itemCheck值会被正确绑定到m.ItemList.itemCheck上,你就不会再遇到空引用异常了。
如果你不想修改ViewModel的构造函数,也可以在POST Action里手动检查并初始化ItemList:
[HttpPost] public ActionResult Items(string ItemDescription, CategoryItemViewModel m) { // 先检查ItemList是否为null,若为null则初始化 if (m.ItemList == null) { m.ItemList = new Item(); } bool originalValue = m.ItemList.itemCheck; // 后续的文件操作代码... return View(); }
不过这种方式需要你在每个用到ItemList的POST Action里都做判断,不如构造函数初始化的方式简洁。
额外提醒
如果你的CategoryList在后续的POST逻辑里也需要被访问,记得也要按照同样的方式初始化它,避免遇到相同的空引用问题。
内容的提问来源于stack exchange,提问作者SeventhWarhawk
相关产品推荐
相关产品推荐

