将null赋给可空int时出错 - "值'null'对于属性无效"

Ste*_*ven 15 c# asp.net asp.net-mvc asp.net-mvc-3

我在我的视图模型中有这个属性:

[DisplayName("Region")]
public int? RegionId { get; set; }
Run Code Online (Sandbox Code Playgroud)

我将我的视图模型传递给我的控制器,ModelState.IsValid如果RegionId为null 则失败.如果我传递一个整数,它可以正常工作.

错误消息是:

值'null'对Region无效

在检查之前我也试过调用它ModelState.IsValid,但是我得到了同样的错误:

if (viewModel.RegionId == null)
    viewModel.RegionId = (int?)null;
Run Code Online (Sandbox Code Playgroud)

这有什么问题?为什么我不能将null赋给可以为空的东西?

ror*_*ods 8

这是另一种可能的解释.

我是AJAX使用jQuery发布到MVC操作方法,如下所示:

$.post('url/here',dataObject);
Run Code Online (Sandbox Code Playgroud)

jQuery会将数据对象转换为查询字符串.我使用默认的模型绑定器将值推送到我的ViewModel中.模型验证失败,"值'null'对字段名称无效".但该属性是一个可以为空的int.在检查原始POST后,我发现我正在POST的数据对象被序列化为一个如下所示的查询字符串:

Field1=null&Field2=value&Field3=value
Run Code Online (Sandbox Code Playgroud)

而不是这个:

Field1=&Field2=value&Field3=value
Run Code Online (Sandbox Code Playgroud)

所以模型验证可以理解为抱怨将字符串文字"null"赋给我的nullable int.一种解决方案是在POST之前检查NULL.我希望我有时间挖掘更多,但我只是转而发送数据对象的JSON表示,它正确处理空值.


Aar*_*man 7

请参见此处:对于可空类型,ModelState验证失败

字符串"null"可能正在传递.在我的场景中,我更新为空字符串""并解决了此错误.


cou*_*ben 6

在Global.asax.cs文件的Application_Start方法中,添加以下行:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Run Code Online (Sandbox Code Playgroud)

问题在于,即使对于可以为空的值类型,默认情况下,默认的ValidatorProvider也会添加"Required"属性.

  • 这似乎没有帮助,我仍然得到同样的错误. (3认同)
  • 文档明确指出`获取或设置一个值,指示是否需要非可空值类型.我在ASP.NET MVC3源代码中查找并确认了它.仅当此设置为"true"时才添加隐式`RequiredAttribute`,元数据表示属性为"IsRequired"且尚未存在RequiredAttribute.默认情况下,"ModelMetadata"表示引用类型和可空类型不需要模型.我遇到了同样的问题,你提出的解决方案对我来说也不起作用.当我发现为什么会发生这种情况以及如何解决问题时,我会发布解决方案. (2认同)