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

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

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

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

{ Email: "" }

Я получил 400 bad request ответов на 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 также не допускает пустую строку.

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

Ответ 1

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

  • Преобразовать string.Empty в null в поле E-mail. Много раз это вполне приемлемо. Вы можете сделать эту работу глобально или просто сделать ваш сеттер преобразовать string.Empty в null в поле электронной почты.
  • Напишите собственный атрибут 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());

Ответ 2

Это легко. Сделай это. до свидания

private string _Email;
[EmailAddress(ErrorMessage = "Ingrese un formato de email válido")]
public string Email { get { return _Email; } set { _Email = string.IsNullOrWhiteSpace(value) ? null : value; } }