2014-05-05 13 views
8

ho immobile nella mia classe PersonDTO:Consenti valore di stringa vuota per la convalida EmailAddress attribuire

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

Funziona bene, tranne che voglio permettere stringhe vuote come valori per il mio modello, se io mando JSON dal lato client :

{ Email: "" } 

ho ricevuto risposta e 400 bad request

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

Tuttavia, Permette omettendo email valore:

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

Ho anche provato

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

ma non funziona.

Per quanto ho capito, il pacchetto Data Annotations Extensions non consente la stringa vuota.

Così, mi chiedo se c'è un modo per personalizzare l'attributo standard [EmailAddress] per consentire stringhe vuote, quindi non devo scrivere attributo di convalida personalizzato.

+1

non penso ci sia un lavoro in giro per questo problema finora. Potresti finire per scrivere un attributo personalizzato che estende EmailAddress o usare l'attributo Regex per convalidare l'indirizzo email valido e consentire la stringa vuota. Riferimento - https://aspnetwebstack.codeplex.com/workitem/1112 – ramiramilu

+0

Possibile duplicato di - http://stackoverflow.com/questions/16098903/emailaddressattribute-without-being-required – ramiramilu

+0

@ramiramilu, sono sorpreso che non risolto questo pensiero grazie per il collegamento – makambi

risposta

19

si hanno due opzioni:

  1. Converti String.Empty su NULL in campo E-mail. Molte volte è perfettamente accettabile. Puoi farlo funzionare globalmente o semplicemente facendo in modo che il setter converta una stringa. Da vuoto a null nel campo dell'email.
  2. Scrivere un attributo EmailAddress personalizzato, poiché EmailAddressAttribute è sigillato, è possibile eseguirne il wrapping e scrivere il proprio metodo di inoltro IsValid.

Esempio:

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

espansione in opzione 1 (da Web Api not converting json empty strings values to null)

Aggiungi questo convertitore:

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); 
    } 
} 

e utilizzare sulla proprietà:

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

o globalmente in WebApiConfig.cs:

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

sta diventando interessante, 1. Non ho capito come convertire globalmente la stringa vuota in null? Ho ottenuto con il campo sottostante e setter/getter. bella idea, grazie 2. wrapper per l'attributo sealed? potresti per favore mostrare un piccolo esempio, ho fallito nel google su di esso) grazie! – makambi

+0

Aggiunto come convertire globalmente o per proprietà. Per eseguire il wrapping è necessario creare il proprio attributo e rendere emailaddressattribute un membro. Quindi istanziare l'indirizzo email e l'attributo originale nel costruttore e rendere ogni proprietà chiamata membro. A questo punto è davvero C#. Se hai bisogno di cercare un esempio specifico cerca il modello decoratore o segui questo link: http://stackoverflow.com/questions/2707401/please-help-me-understand-the-decorator-pattern-with-a-real- world-example/2707425 # 2707425 –

+0

cool, grazie. Coprisco decisamente i miei bisogni – makambi

Problemi correlati