Asp.net-Mvc

允許 EmailAddressAttribute 為空字元串

  • May 5, 2014

我在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 Extensionspack 也不允許空字元串。

因此,我想知道是否有一種方法可以自定義標準EmailAddressAttribute以允許空字元串,這樣我就不必編寫自定義驗證屬性。

你有兩個選擇:

  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 未將 json 空字元串值轉換為 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());

引用自:https://stackoverflow.com/questions/23475806