2014-05-05 74 views
8

我在PersonDTO類有屬性:允許EmailAddress的驗證空字符串值屬性

[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包不允許空字符串。

因此,我不知道是否有一種方法可以自定義標準[EmailAddress]屬性以允許空字符串,因此我不必編寫自定義驗證屬性。

+1

我不認爲有針對此問題的解決辦法爲止。您最終可能會編寫一個擴展EmailAddress的自定義屬性,或者使用Regex Attribute來驗證有效的電子郵件地址並允許空字符串。參考 - https://aspnetwebstack.codeplex.com/workitem/1112 – ramiramilu

+0

可能重複 - - http://stackoverflow.com/questions/16098903/emailaddressattribute-without-being-required – ramiramilu

+0

@ramiramilu,我很驚訝,他們沒有固定這個想法。感謝您的鏈接 – makambi

回答

19

你有兩個選擇:

  1. 轉換的String.Empty爲空的電子郵件字段。很多時候這是完全可以接受的。您可以在全局範圍內完成這項工作,或者只需讓您的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()); 
+0

它變得有趣, 1.我沒有完全得到如何我可以全球轉換字符串爲空爲空?我得到了使用基礎領域和setter/getter。很酷的想法,謝謝 2.封裝屬性的包裝?你能舉個小例子,我用google搜索失敗了)謝謝! – makambi

+0

添加了如何轉換全局或每個屬性。要包裝你需要創建自己的屬性,並使emailaddress分配一個成員。然後在您的構造函數中實例化原始的emailaddressattribute,並使每個屬性都調用成員。 C#在這一點上非常簡單。如果您需要搜索特定的示例查找裝飾模式或按照此鏈接:http://stackoverflow.com/questions/2707401/please-help-me-understand-the-decorator-pattern-with-a-real-世界範例/ 2707425#2707425 –

+0

很酷,謝謝。我絕對涵蓋了我的需求 – makambi

相關問題