EF脚手架生成的Create方法返回.cshtml插入页@Html.EditorFor报NullReferenceException
问题原因说明
1. 为什么EF脚手架默认生成的Create方法没有传递模型实例?
早期ASP.NET MVC设计时默认对@Html.EditorFor做了null兼容:当视图未接收到模型实例、Model属性为null时,EditorFor会直接根据属性的类型元数据生成空白表单控件,不会触发空引用异常,因此脚手架默认简化了代码,不需要在GET请求的Create方法中额外实例化空模型。
2. 为什么之前运行正常,突然出现空引用异常?
通常是项目发生了以下几类变更,打破了原有兼容逻辑:
- 模型类新增了非可空值类型属性(比如
int UserId、DateTime CreateTime这类没有加?声明为可空的属性):当根模型为null时,EditorFor解析表达式访问值类型成员的过程中会直接抛出空引用,引用类型属性则不会触发该问题。 - 项目升级了ASP.NET MVC版本:部分高版本MVC调整了
EditorFor的null处理逻辑,不再静默兼容根模型为null的场景。 - 项目开启了C# 8+的可空引用类型校验:视图声明的
@model为非可空类型时,框架会对Model为null的场景做更严格的检查,触发异常。 - 新增了自定义EditorTemplate:如果你为特定类型添加了自定义编辑器模板,模板中直接访问
Model成员未做null判断,也会在根模型为null时触发异常。
最优实践
你当前手动实例化模型传递给视图的解决方案是完全合理的,也是兼容性最好的写法,不受框架版本、模型属性类型的影响,推荐所有新增页统一使用该写法,修改后的GET方法参考:
public ActionResult Create() { return View(new UserModel()); }
内容的提问来源于stack exchange,提问作者user4221591
相关产品推荐
相关产品推荐

