ASP.NET MVC过滤保存数据时如何处理数据库列空值问题
解决ASP.NET MVC表单字段保存为Null的问题
看起来你遇到了表单提交后部分字段无法正确保存到数据库的问题,我来帮你一步步排查可能的原因:
最常见的原因:视图层表单绑定不匹配
这是这类问题的头号元凶,因为ASP.NET MVC的Model绑定是通过表单元素的name属性来匹配Model属性的。你的控制器接收的是RegViewAndRoleViewModel类型的参数,而目标字段都在它的RegForm属性里,所以视图里的表单元素name必须严格对应。
举个例子,正确的Razor视图代码应该是这样的:
@model RegViewAndRoleViewModel <!-- 全球国家下拉列表 --> @Html.DropDownListFor(m => m.RegForm.Country, ViewBag.CountryList as SelectList, "请选择国家", new { @class = "form-control" }) <!-- DietaryRequirements 文本域 --> @Html.TextAreaFor(m => m.RegForm.DietaryRequirements, new { @class = "form-control", rows = 3 }) <!-- StreetAddressLine 输入框 --> @Html.TextBoxFor(m => m.RegForm.StreetAddressLine, new { @class = "form-control" })
如果是原生HTML写法,name属性必须写成RegForm.Country、RegForm.DietaryRequirements、RegForm.StreetAddressLine,比如:
<select name="RegForm.Country" class="form-control"> <!-- 国家选项 --> </select>
如果name写错了(比如直接写Country而不是RegForm.Country),Model绑定器就无法把值传递到eNtsaRegistration.RegForm对应的属性里,自然保存到数据库就是null。
第二步:调试控制器确认提交值
你可以在控制器的SubmitRegDetails方法里加个断点,查看eNtsaRegistration.RegForm的这几个字段在提交时是否已经是null:
public ActionResult SubmitRegDetails(RegViewAndRoleViewModel eNtsaRegistration) { // 在这里加断点,查看eNtsaRegistration.RegForm.Country、DietaryRequirements、StreetAddressLine的值 if(ModelState.IsValid) { eNtsaRegistration.RegForm.Id = Guid.NewGuid(); db.eNtsaRegForms.Add(eNtsaRegistration.RegForm); db.SaveChanges(); return RedirectToAction("SaveRegForm"); } return View(eNtsaRegistration); }
如果调试时发现这些字段已经是null,那肯定是视图绑定的问题;如果调试时字段有值,但保存后数据库是null,那才需要排查数据库层面的问题。
其他可能的排查点
- 检查
RegViewAndRoleViewModel的定义:确保它确实包含public eNtsaRegForm RegForm { get; set; }这个属性,而且属性名拼写完全正确(C#是大小写敏感的,别把RegForm写成regForm)。 - 数据库字段类型验证:确认数据库中
Country、DietaryRequirements、StreetAddressLine这几个字段是允许为null的(因为你的Model里这些属性没有加[Required]特性,数据库字段应该设置为NULL)。如果数据库字段是NOT NULL,保存时会抛出异常,但你说显示为null,所以这个可能性较低。 - 检查是否有自定义ModelBinder:如果项目中使用了自定义的ModelBinder,可能会干扰默认的绑定逻辑,不过这种情况比较少见,先排除前面的常见问题。
先从视图的name属性检查开始,这几乎是90%以上这类问题的根源,调试一下应该就能找到问题所在。
内容的提问来源于stack exchange,提问作者Gcobza
相关产品推荐
相关产品推荐

