由于对可空数字的验证,ModelState无效

时间:2013-06-19 14:28:53

标签: asp.net-mvc validation

我在Model中有一个名为“ID”的属性,类型为“int?”。并在视图中

@Html.HiddenFor(m => m.ID)

如果Model.ID为null,则隐藏字段的值为空字符串,并且在回发时,由于错误,ModelState.IsValid返回false:

"Object of type 'System.String' cannot be converted to type 'System.Nullable`1[System.Int32]'."

我究竟做错了什么?

4 个答案:

答案 0 :(得分:0)

在您的视图中尝试以下内容:

var id = Model.ID.HasValue ? Model.ID.Value : false;
@Html.HiddenFor(m=> id)

答案 1 :(得分:0)

这里的问题是,MVC显然使用Html.HiddenFor()的相同模板作为可空int(int?)值,就像它对普通int一样。一个非常简单的解决方案是在值为非空的情况下仅发出隐藏字段:

@if ( Model.NullableInt.HasValue ) {
    @Html.HiddenFor(m => m.NullableInt);
}

如果Model.NullableInt为null,则不会发出隐藏字段,因此当您尝试验证时,不会出现显示空字符串的问题。

答案 2 :(得分:0)

嗯,这不是常见的行为,我在项目中扩展了DefaultModelBinder,以便将空值转换为空字符串,这就是导致错误的原因。

答案 3 :(得分:0)

我们每天都在解决方案中这样做,这根本不是问题。以下是我们的模型之一:

public class ClassifiedAd : BaseModel
{
    [Key]
    [Editable(false)]
    public int? ClassifiedAdID { get; set; }

    [Required(ErrorMessage = "Required!")]
    public int? UserID { get; set; }

    [Required(ErrorMessage = "Required!")]
    public int? ClassifiedAdCategoryID { get; set; }

    [Required(ErrorMessage = "Required!")]
    [StringLength(15, ErrorMessage = "Limited to 15 characters!")]
    [RegularExpression(RegularExpressions.USPhone, ErrorMessage = "Must be a valid phone number!")]
    public string Phone { get; set; }

    [Required(ErrorMessage = "Required!")]
    [RegularExpression(RegularExpressions.SafeAlphaNumeric, ErrorMessage = "Only letters, numbers, dashes and underscores are allowed!")]
    [StringLength(100, ErrorMessage = "Limited to 100 characters!")]
    public string AddTitle { get; set; }
}

正如您所看到的,我们为所有模型属性使用了可空类型。但是,这不会导致您描述的任何问题。在我们的观点中,我们有:

@Html.HiddenFor(model => model.ClassifiedAdID)
@Html.HiddenFor(model => model.UserID)

一切都映射并正常工作。我不确定是什么原因导致你的问题(需要看到你的整个代码来解决这个问题),但我认为你需要在这里看看其他可能性。您使用的是什么版本的MVC?