允许 EmailAddressAttribute 为空字符串

Posted

技术标签:

【中文标题】允许 EmailAddressAttribute 为空字符串【英文标题】:Allow empty string for EmailAddressAttribute 【发布时间】:2014-06-21 22:50:18 【问题描述】:

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

【问题讨论】:

我认为到目前为止还没有解决此问题的方法。您最终可能会编写扩展 EmailAddress 的自定义属性,或者使用 Regex 属性来验证有效的电子邮件地址并允许空字符串。参考 - aspnetwebstack.codeplex.com/workitem/1112 可能重复 - ***.com/questions/16098903/… 【参考方案1】:

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

TargetNullValue=''

【讨论】:

【参考方案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;  

【讨论】:

【参考方案3】:

你有两个选择:

    在电子邮件字段中将 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 的扩展(来自 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. 我不太明白如何将字符串全局转换为空字符串?我使用了基础字段和 setter/getter。好主意,谢谢 2. 密封属性的包装器?你能举个小例子吗,我在谷歌上搜索失败了)谢谢! 添加了如何全局或按属性进行转换。要包装您需要创建自己的属性,并使 emailaddress 属性成为成员。然后在您的构造函数中实例化原始电子邮件地址属性,并使每个属性都调用该成员。在这一点上,它真的是直接的 C#。如果您需要搜索特定示例,请查找装饰器模式或点击此链接:***.com/questions/2707401/…

以上是关于允许 EmailAddressAttribute 为空字符串的主要内容,如果未能解决你的问题,请参考以下文章

EmailAddressAttribute 验证规则

EmailAddressAttribute 错误地将法国电子邮件地址分类为无效

为啥 EmailAddressAttribute.IsValid 和 MailAddress 认为包含“ª”的电子邮件是有效的? [复制]

针对无效字符验证电子邮件地址

Mate 20 允许后台程序允许设置,除了锁任务,允许自启动。

如何检查是不是允许“允许管理所有文件”?