【问题标题】:Allow empty string for EmailAddressAttribute允许 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 以允许空字符串,这样我就不必编写自定义验证属性了。

【问题讨论】:

标签: asp.net-mvc validation attributes


【解决方案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】:

      你有两个选择:

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

      选项 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#。如果您需要搜索特定示例,请查找装饰器模式或点击此链接:stackoverflow.com/questions/2707401/…
      猜你喜欢
      • 2015-10-04
      • 2018-08-15
      • 2019-07-16
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2016-01-25
      相关资源
      最近更新 更多