今天下午,有个项目里的一个页面有点小改动,提交后,测试发现了一个错误:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对 null 引用执行运行时绑定
一个奇怪的错误,为什么这么说呢?
<div>
@if (!Model.abcdefg.HasValue)
{ ... }
</div>
很普通的代码,按理说不会有错,之前也没报错。
经过深入修改前后代码对比,发现这里的Model,原先是小写的model。
于是查看小写model的定义:
@{
Layout = "~/Views/Shared/site.cshtml";
var model = Model as xxxx.yyyyyy;
}
原来问题在这里,小写model是经过类型格式化的对象,因此能识别字段类型为可空,所以以前不会报错,现在因为手误直接改成大写了,变成MVC框架默认的动态对象了,失去了可空类型的定义,因此报错。
虽然到这里,问题已经找到,也很好解决,但是,事情还没完。。。。
大家都知道,Asp.net MVC 的页面数据模型类型化,是有一个标准做法的:
@{
Layout = "...";
...
}
@model xxxx.yyyyy
于是,我顺手就把这个不正常的对象变量换成了标准的定义。
结果,页面又报出一堆的错误。。。。。
都是各种字段属性类型和值的不匹配的错误。。。。
坑啊。。。。
所以,同志们,以后页面数据模型对象,一定要按标准方法定义,不要随随便便,给自己和别人挖坑了。。。。