19

我使用CodeFirst Entitty框架5.我有一個代表用戶的類。允許空字符串用於標記PhoneAttribute或UrlAttribute的字段

public class User 
{ 
    [Key] 
    public int UserId { get; set; } 

    [Url] 
    [DataType(DataType.Url)] 
    [Required(AllowEmptyStrings= true)] 
    public string WebSite { get; set; } 

    [Phone] 
    [DataType(DataType.PhoneNumber)] 
    [Required(AllowEmptyStrings = true)] 
    public string Phone { get; set; } 

    [Phone] 
    [DataType(DataType.PhoneNumber)] 
    [Required(AllowEmptyStrings = true)] 
    public string Fax { get; set; } 
} 

我喜歡PhoneUrl驗證力學屬性很多,但不幸的是,當標有這些屬性的字段爲空字符串這其實我是想允許驗證失敗。 [Required(AllowEmptyStrings = true)]似乎不適用於PhoneUrl屬性。這似乎也適用於其他一些DataAnnotations屬性,如EmailAddress

有沒有辦法允許空字符串標記有這些屬性的字段?

回答

17

確認屬性如[Phone][EmailAddress]將檢查任何非空字符串值。因爲string類型固有地爲空,所以傳遞給ModelBinder的空字符串被讀取爲null,它通過了驗證檢查。

當您添加[Required]屬性時,字符串變爲非空值。 (如果使用Code First,EF將腳本編寫一個不可爲空的數據庫列。)ModelBinder現在將空白值解釋爲String.Empty - 這將使屬性驗證檢查失敗。

那麼有沒有辦法讓空字符串與驗證屬性,但你可以讓字符串。您只需刪除[Required]屬性即可。空白值將是null,非空值將被驗證。

在我的情況下,我從CSV文件導入記錄,並且出現此問題,因爲我跳過了正常的ModelBinder。如果你正在做一些不尋常的這個樣子,一定要保存你的數據模型之前,包括人工檢查:

Email = (record.Email == String.Empty) ? null : record.Email 
+0

我沒有使用模型綁定。我在寫數據導入程序,源數據包含空白的電子郵件和電話。我想我應該只將空字符串從源代碼轉換爲空值。感謝您的解釋! –

+1

@ Nu-hin。你的DBA將在未來感謝你,如果你陷入了清理像空字符串這樣含糊不清的無用數值並將其替換爲null的習慣。空值未定義或未知。空字符串電話號碼未定義或未知。總是樂於在數年後開展工作,並在電話號碼字段中找到空白字符串,空白字符串以及始終有用的「NO PHONE NUMBER」組合。 –

+0

這似乎相當無益。是的*在某些情況下,缺少值意味着「未知」,但「絕對空」意味着與「未知」完全不同。所以有些情況下空字符串不是「毫無意義的值」。 –

24

使用以下兩個數據註釋:

[Required(AllowEmptyStrings = true)] 
[DisplayFormat(ConvertEmptyStringToNull = false)] 
+0

這完全爲EF6工作,謝謝! –

+0

工作得很好,但我想知道爲什麼visual在我的情況下生成[必需] [StringLength(10)]如果我不空,nvarchar(10) –

+0

刪除此[「DisplayFormat(ConvertEmptyStringToNull = false)]」已爲我工作。謝謝 – HGMamaci

相關問題