2014-05-05 18 views
8

Mam właściwość w moim klasy PersonDTO:Pozwól pusty ciąg znaków do walidacji EmailAddress przypisują

[EmailAddress] 
public string Email { get; set; } 

To działa dobrze, z wyjątkiem chcę, aby umożliwić puste ciągi jako wartości dla mojego modelu, jeśli wyślę JSON od strony klienta :

{ Email: "" } 

mam 400 bad request odpowiedź i

{"$id":"1","Message":"The Email field is not a valid e-mail address."} 

jednak pozwala to pomijając email wartość:

{ FirstName: "First", LastName: 'Last' } 

Próbowałem też

[DataType(DataType.EmailAddress, ErrorMessage = "Email address is not valid")] 

ale to nie działa.

O ile zrozumiałem, Data Annotations Extensions pakiet nie zezwala na pusty ciąg znaków.

Zastanawiam się więc, czy istnieje sposób na dostosowanie standardowego atrybutu [EmailAddress], aby zezwolić na puste ciągi, więc nie muszę pisać niestandardowego atrybutu sprawdzania poprawności.

+1

nie sądzę jest tam pracę wokół tego problemu do tej pory. Możesz zakończyć pisanie niestandardowego atrybutu rozszerzającego EmailAddress lub użyć Atrybutu Regeksu, aby zweryfikować poprawny adres e-mail i zezwolić na pusty ciąg znaków. Odniesienie - https://aspnetwebstack.codeplex.com/workitem/1112 – ramiramilu

+0

Ewentualny duplikat - http://stackoverflow.com/questions/16098903/emailaddressattribute-without-beired- – ramiramilu

+0

@ramiramilu, jestem zaskoczony, że nie naprawiłem to myślenie. dzięki za link – makambi

Odpowiedz

19

Masz dwie opcje:

  1. Konwersja string.Empty NULL w polu E-mail. Wiele razy jest to całkowicie dopuszczalne. Możesz zrobić to globalnie, lub po prostu dokonując konwersji setter string.Empty to null w polu email.
  2. Napisz niestandardowy atrybut EmailAddress, ponieważ EmailAddressAttribute jest zapieczętowany, możesz go opakować i napisać własną metodę IsValid przesyłania dalej.

Próbka:

bool IsValid(object value) 
{ 
    if (value == string.Empty) 
    { 
     return true; 
    } 
    else 
    { 
     return _wrappedAttribute.IsValid(value); 
    } 
} 

Ekspansja na opcję 1 (z Web Api not converting json empty strings values to null)

Dodaj tego konwertera:

public class EmptyToNullConverter : JsonConverter 
{ 
    private JsonSerializer _stringSerializer = new JsonSerializer(); 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(string); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, 
            object existingValue, JsonSerializer serializer) 
    { 
     string value = _stringSerializer.Deserialize<string>(reader); 

     if (string.IsNullOrEmpty(value)) 
     { 
      value = null; 
     } 

     return value; 
    } 

    public override void WriteJson(JsonWriter writer, object value, 
            JsonSerializer serializer) 
    { 
     _stringSerializer.Serialize(writer, value); 
    } 
} 

i używania na miejscu:

[JsonConverter(typeof(EmptyToNullConverter))] 
public string EmailAddress {get; set; } 

lub globalnie w WebApiConfig.cs:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
    new EmptyToNullConverter()); 
+0

robi się interesująco, 1. Nie bardzo rozumiem, jak mogę globalnie przekonwertować ciąg pusty na zerowy? Mam za pomocą podstawowego pola i setera/gettera. fajny pomysł, dzięki 2. opakowanie dla zapieczętowanego atrybutu? czy mógłbyś pokazać mały przykład, nie udało mi się go uruchomić) dzięki! – makambi

+0

Dodano sposób konwertowania globalnie lub na właściwości. Aby zawinąć, musisz utworzyć własny atrybut i ustawić adres e-mail jako adres członkowski. Następnie wykonaj instancję oryginalnego adresu e-mailowego w swoim konstruktorze, a także spraw, aby każda właściwość wywoływała członka. To naprawdę proste C# w tym momencie. Jeśli potrzebujesz szukać konkretnego przykładu, poszukaj wzoru dekoratora lub kliknij ten link: http://stackoverflow.com/questions/2707401/please-help-me-understand-decorator-pattern-with-a-real- world-example/2707425 # 2707425 –

+0

fajne, dzięki. Zdecydowanie pokrywa moje potrzeby – makambi

Powiązane problemy