允许EmailAddressAttribute的空字符串

mak*_*mbi 15 validation asp.net-mvc attributes

PersonDTO班上有财产:

[EmailAddress]
public string Email { get; set; }
Run Code Online (Sandbox Code Playgroud)

它工作正常,除非我想允许空字符串作为我的模型的值,如果我从客户端发送JSON:

{ Email: "" }
Run Code Online (Sandbox Code Playgroud)

我得到了400 bad request答复

{"$id":"1","Message":"The Email field is not a valid e-mail address."}
Run Code Online (Sandbox Code Playgroud)

但是,它允许省略email值:

{ FirstName: "First", LastName: 'Last' }
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

[DataType(DataType.EmailAddress, ErrorMessage = "Email address is not valid")]
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

据我所知,Data Annotations Extensionspack也不允许空字符串.

因此,我想知道是否有一种方法可以自定义标准EmailAddressAttribute以允许空字符串,因此我不必编写自定义验证属性.

Yis*_*zer 27

您有两种选择:

  1. 在"电子邮件"字段中将string.Empty转换为null.很多时候这是完全可以接受的.您可以在全局范围内完成此工作,或者只需将您的setter转换为电子邮件字段上的string.Empty为null即可.
  2. 编写自定义EmailAddress属性,因为EmailAddressAttribute是密封的,您可以将其包装并编写自己的转发IsValid方法.

样品:

bool IsValid(object value)
{
    if (value == string.Empty)
    {
        return true;
    }
    else
    {
        return _wrappedAttribute.IsValid(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

扩展选项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);
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用该属性:

[JsonConverter(typeof(EmptyToNullConverter))]
public string EmailAddress {get; set; }
Run Code Online (Sandbox Code Playgroud)

或者在WebApiConfig.cs中全局:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
    new EmptyToNullConverter());
Run Code Online (Sandbox Code Playgroud)


小智 12

这很简单。做这个。再见

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; } }
Run Code Online (Sandbox Code Playgroud)