【问题标题】:ModelState is not valid due to validation on a nullable number由于对可空数字进行验证,ModelState 无效
【发布时间】:2013-06-19 14:28:53
【问题描述】:

我在模型中有一个名为“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]'."

我到底做错了什么?

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

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

    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?

    【讨论】:

    • 你是对的,可能我的更新在你回复时不可用,这是导致这种行为的项目已经存在的东西(见我的回答),我花了很多时间直到我弄清楚,但你是 100% 正确的。谢谢
    【解决方案2】:

    在您的视图中尝试以下操作:

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

    【讨论】:

    • 你能复习一下语法吗?我认为有些事情不正确,我不明白它应该如何处理
    • 对不起,请尝试上述方法。
    【解决方案3】:

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

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

    Model.NullableInt为null的情况下,隐藏字段不会被发出,因此你不会遇到验证时出现空字符串的问题。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2020-11-12
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2018-02-15
        • 2021-05-27
        • 1970-01-01
        • 2020-03-03
        • 2021-09-10
        相关资源
        最近更新 更多