2013-06-19 67 views
0

我在Model中有一個名爲「ID」類型爲「int?」的屬性。並鑑於ModelState由於驗證可空號碼而無效

@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]'." 

究竟我做錯了嗎?

回答

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?

+0

你是對的,可能我的更新在你的迴應時間不可用,這是已經存在的項目導致了這種行爲(請參閱我的回答),花了我很多時間,直到我找出來,但你是100%正確。謝謝 –

0

嘗試下面您的看法:

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

請問您可以查看語法嗎?我相信有些東西是不正確的,我不明白它應該如何行動 –

+0

對不起,請嘗試以上操作。 – hutchonoid

0

的這裏的問題是,MVC顯然使用相同的模板Html.HiddenFor()可空INT(int?),因爲它確實爲正常int值。一個很簡單的解決辦法是隻能發出的情況下隱藏字段,該值爲非空:

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

Model.NullableInt爲空的情況下,隱藏字段將不發射,因此,你贏了當你嘗試驗證時沒有出現空字符串的問題。

0

好吧,這不是常見的行爲,我在項目中擴展了DefaultModelBinder,使得空值被轉換爲空字符串,這就是導致錯誤的原因。