Разрешить пустую строку для EmailAddressAttribute

у меня есть собственность в моей PersonDTO класс:

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

он отлично работает, за исключением того, что я хочу разрешить пустые строки в качестве значений для моей модели, если я отправлю JSON со стороны клиента:

{ Email: "" }

я получил 400 bad request ответ и

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

однако, это позволяет опуская email значение:

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

я тоже пробовал:

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

но это не работает.

насколько я понял, Data Annotations Extensions pack не разрешает пустую строку любой.

таким образом, мне интересно, есть ли способ настроить стандарт EmailAddressAttribute чтобы разрешить пустые строки, поэтому мне не нужно писать пользовательский атрибут проверки.

1 ответов


у вас есть два варианта:

  1. преобразовать строку.Пустое значение null в поле электронной почты. Во многих случаях это вполне приемлемо. Вы можете сделать эту работу глобально или просто сделать свою строку преобразования сеттера.Пустое значение null в поле электронной почты.
  2. напишите пользовательский атрибут EmailAddress, так как EmailAddressAttribute запечатан, вы можете обернуть его и написать свой собственный метод пересылки IsValid.

пример:

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

расширение на вариант 1 (от Web Api не преобразует значения пустых строк json в null)

добавить этот конвертер:

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

и используйте на свойстве:

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

или глобально в WebApiConfig.cs:

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