19

markiert sind. Ich benutze CodeFirst Entity Framework 5. Ich habe eine Klasse, die einen Benutzer darstellt.Lassen Sie leere Zeichenfolgen für Felder zu, die mit PhoneAttribute oder 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; } 
} 

Ich mag die Validierungs Mechanik für Phone und Url Attribute viel, aber leider die Validierung fehlschlägt, wenn Felder mit diesen Attributen markiert sind leere Strings, die ich will eigentlich ermöglichen. [Required(AllowEmptyStrings = true)] scheint nicht mit Phone oder Url Attribute zu arbeiten. Dasselbe gilt für einige andere DataAnnotations-Attribute wie EmailAddress.

Gibt es eine Möglichkeit, leere Zeichenfolgen für Felder zuzulassen, die mit solchen Attributen gekennzeichnet sind?

Antwort

17

Validierungsattribute wie [Phone] und [EmailAddress] überprüfen alle Nicht-Null-Zeichenfolgenwerte. Da der string-Typ inhärent nullwertfähig ist, werden leere Zeichenfolgen, die an den ModelBinder übergeben werden, als null gelesen, wodurch die Validierungsprüfung bestanden wird.

Wenn Sie das Attribut [Required] hinzufügen, wird die Zeichenfolge effektiv nicht nullfähig. (Wenn Sie Code First verwenden, wird EF eine nicht nullfähige Datenbankspalte skripten.) Der ModelBinder interpretiert jetzt einen leeren Wert als String.Empty - was die Attributvalidierungsprüfung nicht besteht.

So gibt es keine Möglichkeit leer Strings mit Validierungs Attribute zu erlauben, aber Sie können null Strings ermöglichen. Alles was Sie tun müssen, ist das [Required] Attribut zu entfernen. Leerwerte sind null und nicht leere Werte werden validiert.

In meinem Fall importiere ich Datensätze aus einer CSV-Datei und hatte dieses Problem, weil ich den normalen ModelBinder übersprang. Wenn Sie etwas Ungewöhnliches wie dies tun, sollten Sie eine manuelle Prüfung einzubeziehen, bevor Sie Ihr Datenmodell zu speichern:

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

Ich war nicht Modell Binder verwendet wird. Ich schrieb Datenimporteur und die Quelldaten enthalten leere E-Mails und Telefone. Ich denke, ich sollte einfach leere Zeichenfolgen von der Quelle in Nullen konvertieren. Danke für die Erklärung! –

+1

@ Nu-hin. Ihr Datenbankadministrator wird Ihnen in Zukunft danken, wenn Sie sich daran machen, mehrdeutige sinnlose Werte wie leere Strings zu bereinigen und sie durch null zu ersetzen. Null ist undefiniert oder unbekannt. Eine leere String-Telefonnummer ist nicht definiert oder unbekannt. Es macht immer Spaß, Jahre später mit einer db zu arbeiten und eine Mischung aus leeren Strings, Whitespace Strings und der immer nützlichen "NO PHONE NUMBER" im Telefonnummernfeld zu finden. –

+0

Das scheint ziemlich wenig hilfreich zu sein. Ja in * manchen * Situationen bedeutet die Abwesenheit eines Wertes "nicht bekannt", aber "definitiv leer" bedeutet etwas ganz anderes als "nicht bekannt". Es gibt also Fälle, in denen eine leere Zeichenfolge kein "sinnloser Wert" ist. –

24

Verwenden Sie die folgenden zwei Daten Anmerkungen:

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

Dies total hat für mich auf EF6 gearbeitet, danke! –

+0

Funktioniert sehr gut, aber ich frage mich, warum Visual generiert in meinem Fall [Erforderlich] [StringLength (10)] Wenn ich nicht null, nvarchar (10) –

+0

Entfernen von "" DisplayFormat (ConvertEmptyStringToNull = false)] "hat für mich funktioniert . Danke – HGMamaci