允许 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.IsValid 和 MailAddress 认为包含“ª”的电子邮件是有效的? [复制]