19

Używam CodeFirst Entitty framework 5. Mam klasę reprezentującą użytkownika.Zezwalaj na puste ciągi dla pól oznaczonych jako PhoneAttribute lub 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; } 
} 

Lubię mechanika walidacji dla Phone i Url przypisuje się wiele, ale niestety nie powiedzie się podczas sprawdzania poprawności pola oznaczone tymi atrybutami są puste struny, które faktycznie chcą pozwolić. [Required(AllowEmptyStrings = true)] nie działa z atrybutami Phone lub Url. To samo wydaje się mieć zastosowanie do niektórych innych atrybutów DataAnnotations, takich jak EmailAddress.

Czy istnieje sposób na zezwolenie na puste ciągi dla pól oznaczonych takimi atrybutami?

Odpowiedz

17

Atrybuty sprawdzania poprawności, takie jak [Phone] i [EmailAddress], sprawdzi wszystkie niepuste wartości łańcuchowe. Ponieważ typ string jest z natury zerowy, puste ciągi przekazywane do modułu modelu są odczytywane jako null, które pomyślnie sprawdzają poprawność.

Po dodaniu atrybutu [Required] ciąg staje się efektywnie nie-nullable. (Jeśli korzystasz z Code First, EF zakoduje nie-nullable kolumnę bazy danych.) ModelBinder teraz interpretuje pustą wartość jako String.Empty - co nie powiedzie się sprawdzeniu poprawności atrybutu.

Więc nie ma sposobu, aby umożliwić pustych sznurki z atrybutami walidacji, ale można zezwolić zerowy struny. Wszystko, co musisz zrobić, to usunąć atrybut [Required]. Puste wartości będą null, a niepuste wartości będą sprawdzane.

W moim przypadku importuję rekordy z pliku CSV i miałem ten problem, ponieważ pomijałem normalny modelBinder. Jeśli robisz coś niezwykłego tak, należy pamiętać o ręczną kontrolę przed zapisaniem do modelu danych:

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

ja nie używałem modelu spoiwa. Pisałem importera danych, a dane źródłowe zawierają puste e-maile i telefony. Sądzę, że powinienem po prostu przekonwertować puste łańcuchy ze źródła na wartości zerowe. Dziękuję za wyjaśnienie! –

+1

@ Nu-hin. Twój DBA będzie ci dziękować w przyszłości, jeśli masz zamiar oczyścić niejednoznaczne, bezsensowne wartości, takie jak puste ciągi i zastąpić je wartością zerową. Null jest niezdefiniowany lub nieznany. Pusty ciągowy numer telefonu jest niezdefiniowany lub nieznany. Zawsze fajnie jest pracować na bazie db lat później i znaleźć mieszankę pustych, pustych ciągów, białych znaków i zawsze pomocny "NUMER TELEFONU" w polu numeru telefonu. –

+0

Wydaje się to dość pomocne. Tak w * niektórych * sytuacjach, brak wartości oznacza "nieznany", ale "Zdecydowanie pusty" oznacza coś zupełnie innego niż "Nieznany". Są więc przypadki, w których pusty ciąg nie jest "bezcelową wartością". –

24

używać następujących adnotacji dwóch danych:

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

To całkowicie pracował dla mnie na EF6, dzięki! –

+0

Działa bardzo dobrze, ale zastanawiam się, dlaczego wizualny wygenerował w moim przypadku [Wymagane] [StringLength (10)], jeśli nie mam null, nvarchar (10) –

+0

Usunięcie tego "[DisplayFormat (ConvertEmptyStringToNull = false)]" pracował dla mnie . Dziękuję – HGMamaci

Powiązane problemy