我在我的视图模型中有这个属性:
[DisplayName("Region")]
public int? RegionId { get; set; }
我将我的视图模型传递给我的控制器,如果RegionId为null,它在ModelState.IsValid
失败。如果我传递一个整数,它就可以正常工作。
错误消息是:
值'null'对于Region
无效
在检查ModelState.IsValid
之前,我也试过调用它,但是我得到了同样的错误:
if (viewModel.RegionId == null)
viewModel.RegionId = (int?)null;
这里有什么问题?为什么我不能将null赋给可以为空的东西?
答案 0 :(得分:8)
这是另一种可能的解释。
我是AJAX使用jQuery发布到MVC操作方法,如下所示:
$.post('url/here',dataObject);
jQuery会将数据对象转换为查询字符串。我使用默认的模型绑定器将值推送到我的ViewModel中。模型验证失败,“值'null'对字段名称无效”。但该属性是一个可以为空的int。在检查原始POST后,我发现我正在POST的数据对象被序列化为一个如下所示的查询字符串:
Field1=null&Field2=value&Field3=value
而不是这个:
Field1=&Field2=value&Field3=value
因此,模型验证可以理解为抱怨将字符串文字'null'分配给我的nullable int。一种解决方案是在POST之前检查NULL。我希望我有时间深入挖掘,但我只是转而发送数据对象的JSON表示,该表示正确处理空值。
答案 1 :(得分:7)
见这里:ModelState validation fails for nullable types
可能正在传递字符串“null”。在我的场景中,我更新为空字符串“”并解决了此错误。
答案 2 :(得分:6)
在Global.asax.cs文件的Application_Start方法中,添加以下行:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
问题在于,即使对于可以为空的值类型,默认情况下,默认的ValidatorProvider也会添加“Required”属性。
答案 3 :(得分:1)
我认为问题不是分配null,而是消费代码除了null值之外。赋值完全有效(尽管您的空检查被反转,并且转换是多余的)。
viewModel.RegionId = null;
另外,您可以使用HasValue
检查可空类型的null。虽然实际上这与空检查没有什么不同,但看起来更清晰:
if (viewModel.RegionId.HasValue)
{
// do something
}
答案 4 :(得分:0)
我感觉问题出在您展示的示例代码之外的某处。我创建了一个示例应用程序,它只创建一个表单并具有可为空的字段,但它按预期工作。我将开始消除您的设置中的其他变量,直到您可以使用具有可空属性的工作ViewModel,并且您应该能够识别导致问题的原因。
答案 5 :(得分:0)
我遇到了这个问题。
我的问题是我在POST中明确地将违规属性设置为null。所以,就像你拥有的一样,请求看起来像是:
RegionId = null
在我的情况下,它就像省略显式声明一样简单(例如,不要说它为空,只是不发送任何数据)