0

我在模型中有名为“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

4 回答 4

0

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

var id = Model.ID.HasValue ? Model.ID.Value : false;
@Html.HiddenFor(m=> id)
于 2013-06-19T14:34:38.273 回答
0

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

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

在 whereModel.NullableInt为 null 的情况下,不会发出隐藏字段,因此在尝试验证时不会出现空字符串的问题。

于 2013-06-19T15:01:09.493 回答
0

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

于 2013-06-19T20:15:56.493 回答
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?

于 2013-06-19T20:39:59.790 回答