2012-11-29 67 views
21

我收到下面的VM上的Web API POST操作的Web API爲空的屬性要求的DataMember屬性

public class ViewModel 
{ 
    public string Name { get; set; } 

    [Required] 
    public int? Street { get; set; } 
} 

當我做一個職位,我收到以下錯誤:

Property 'Street' on type 'ViewModel' is invalid. Value-typed properties marked as [Required] must also be marked with [DataMember(IsRequired=true)] to be recognized as required. Consider attributing the declaring type with [DataContract] and the property with [DataMember(IsRequired=true)].

似乎錯誤很明顯,所以我只想確保當你有一個具有所需可空屬性的類時需要使用[DataContract]和[DataMember]屬性。

有沒有辦法避免在Web API中使用這些屬性?

回答

20

我面臨着同樣的問題,因爲你,我認爲這是完全荒謬的。對於值類型,我可以看到[Required]不起作用,因爲值類型的屬性不能爲空,但是當您有可爲空的值類型時,不應該是是任何問題。但是,Web API模型驗證邏輯似乎以相同的方式處理不可爲空和可爲null的值類型,因此您必須解決此問題。我在Web API forum發現了一個變通辦法,我們可以確認它的工作原理:創建一個ValidationAttribute子和空值類型的屬性,而不是應用它的RequiredAttribute

using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

public class NullableRequiredAttribute : ValidationAttribute, IClientValidatable 
{ 
    public bool AllowEmptyStrings { get; set; } 

    public NullableRequiredAttribute() 
     : base("The {0} field is required.") 
    { 
     AllowEmptyStrings = false; 
    } 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return false; 

     if (value is string && !this.AllowEmptyStrings) 
     { 
      return !string.IsNullOrWhiteSpace(value as string); 
     } 

     return true; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var modelClientValidationRule = new ModelClientValidationRequiredRule(FormatErrorMessage(metadata.DisplayName)); 
     yield return modelClientValidationRule; 
    } 
} 

NullableRequiredAttribute使用:

public class Model 
{ 
    [NullableRequired] 
    public int? Id { get; set; } 
} 
+0

自從我發佈這個問題已經有一段時間了,實際上我最終做了你的建議,我仍然不明白爲什麼web api會以這種方式工作 – jorgehmv

+3

@jorgehmv我認爲它是一個錯誤,除非有人說服我,否則。 – aknuds1

+0

WebApi 2版本中不再存在這個問題。該錯誤似乎是固定的。如果有什麼我很惱火,我必須使ViewModel屬性爲空時,我不需要發佈值爲Required以返回正確的錯誤消息。 –

2

我認爲你正在運行到同樣的問題在這裏討論:

DataAnnotation for Required property

+0

是的,我後來發現相同的解決方案。在我看來,這是一種更優雅的方式:你現在仍然可以使用默認的驗證器。 –

0

這在Web Api 2中得到修復。但是,只有當字段是帶有get/set的屬性時纔有意思。

相關問題