繁体   English   中英

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

[英]Error assigning null to a nullable int - “The value 'null' is not valid for property”

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

[DisplayName("Region")]
public int? RegionId { get; set; }

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

错误消息是:

值'null'对Region无效

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

if (viewModel.RegionId == null)
    viewModel.RegionId = (int?)null;

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

这是另一种可能的解释。

我是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表示,它正确处理空值。

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

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

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

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

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

我认为问题不是分配null,而是消费代码除了空值之外。 赋值完全有效(尽管您的空检查被反转,并且转换是多余的)。

viewModel.RegionId = null;

另外,您可以使用HasValue在可空类型上检查null。 虽然实际上这与空检查没有什么不同,但看起来更清晰:

if (viewModel.RegionId.HasValue)
{
    // do something
}

我有这个问题。

我的问题是我在POST中明确地将违规属性设置为null。 所以,类似于你所拥有的,请求看起来像:

RegionId = null

在我的情况下,它就像省略显式声明一样简单(例如,不要说它是null,只是不发送任何数据)

我有一种感觉,问题出在您展示的示例代码中。 我创建了一个示例应用程序,它只创建一个表单并具有可为空的字段,但它按预期工作。 我将开始消除您的设置中的其他变量,直到您可以使用具有可空属性的工作ViewModel,并且您应该能够识别导致问题的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM