Asp.net mvc 允许EmailAddressAttribute为空字符串

Asp.net mvc 允许EmailAddressAttribute为空字符串,asp.net-mvc,validation,attributes,Asp.net Mvc,Validation,Attributes,我在我的PersonDTO类中拥有财产: [EmailAddress] public string Email { get; set; } 它工作正常,但如果我从客户端发送JSON,我希望允许空字符串作为模型的值: { Email: "" } 我收到了400个错误请求响应 {"$id":"1","Message":"The Email field is not a valid e-mail address."} 但是,它允许省略电子邮件值: { FirstName: "First", La

我在我的
PersonDTO
类中拥有财产:

[EmailAddress]
public string Email { get; set; }
它工作正常,但如果我从客户端发送JSON,我希望允许空字符串作为模型的值:

{ Email: "" }
我收到了
400个错误请求
响应

{"$id":"1","Message":"The Email field is not a valid e-mail address."}
但是,它允许省略
电子邮件
值:

{ FirstName: "First", LastName: 'Last' }
我还尝试:

[DataType(DataType.EmailAddress, ErrorMessage = "Email address is not valid")]
但它不起作用

据我所知,
dataannotationextensions
pack也不允许空字符串

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

您有两个选项:

  • 将电子邮件字段上的string.Empty转换为null。很多时候,这是完全可以接受的。您可以在全局范围内执行此操作,或者只需让setter将电子邮件字段上的string.Empty转换为null即可
  • 写一个自定义的EmailAddress属性,因为EmailAddressAttribute是密封的,所以您可以包装它并编写自己的转发IsValid方法
  • 样本:

    bool IsValid(object value)
    {
        if (value == string.Empty)
        {
            return true;
        }
        else
        {
            return _wrappedAttribute.IsValid(value);
        }
    }
    
    选项1的扩展(从)

    添加此转换器:

    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);
        }
    }
    
    或在WebApiConfig.cs中全局访问:

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

    这很容易。这样做。再见

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

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

    TargetNullValue=''
    

    我认为目前为止还没有解决这个问题的办法。您可能会编写一个扩展EmailAddress的自定义属性,或者使用Regex属性验证有效的电子邮件地址并允许空字符串。参考资料-可能重复-它变得有趣,1。我不太明白如何全局地将字符串空转换为null?我开始使用底层字段和setter/getter。好主意,谢谢。密封属性的包装器?你能举个小例子吗,我在谷歌搜索失败了)谢谢!添加了如何全局转换或按属性转换。要包装,您需要创建自己的属性,并使emailaddressattribute成为成员。然后在构造函数中实例化原始的emailaddressattribute,并使每个属性调用成员。在这一点上,这真的是直截了当的。如果您需要搜索特定示例,请查找装饰图案或遵循以下链接:
    TargetNullValue=''