允许EmailAddressAttribute的空字符串

时间:2014-05-05 15:07:14

标签: asp.net-mvc validation attributes

我的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以允许空字符串,因此我不必编写自定义验证属性。

3 个答案:

答案 0 :(得分:25)

您有两种选择:

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

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

    扩展选项1(来自Web Api not converting json empty strings values to 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());
    

答案 1 :(得分:0)

将绑定的TargetNullValue属性设置为空字符串。

TargetNullValue=''

答案 2 :(得分:-1)

很简单。做这个。再见

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