2012-11-29 18 views
21

を必要と私はポストを作るとき、私は次のエラーを取得するのWeb APIのPOSTアクションのWeb APIのNULL可能必要なプロパティは、DataMemberを属性

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

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

上で、次のVMを受け付けておりますエラーはクリアなので、必要なnull可能なプロパティを持つクラスがある場合は、[DataContract]および[DataMember]属性を使用する必要があることを完全に確実に確認したいだけです。

Web APIでこれらの属性を使用しないようにする方法はありますか?

答えて

20

私はあなたと同じ問題に直面している、と私はそれが完全にナンセンスだと思います。値型では、値型のプロパティをnullにすることはできないので、[Required]は機能しませんが、NULL値型がある場合は、にはを指定しないでください。しかし、Web APIモデル検証ロジックは、nullableでもnull値でもない値の型を同じ方法で扱うようです。そのため、回避する必要があります。私はWeb API forumに回避策発見し、それが動作していることを確認することができます:ValidationAttributeサブクラスを作成し、null入力可能値型付けされたプロパティに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リリースでは問題になりません。バグは修正されているようです。何か問題があれば、正しいエラーメッセージを返すためにRequiredの値が不足しているときに、ViewModelの属性をnullにできるようにしなければならないと迷惑を掛けています。 –

2

私はここで説明したように、あなたが同じ問題に実行されていると思う:

DataAnnotation for Required property

+0

ええ、後で同じ解決策が見つかりました。私の意見では、それはよりエレガントな方法です:今でもデフォルトのバリデーターを使用することができます。 –

0

これはWeb Api 2で修正されています。ただし、興味深いのは、フィールドがget/setを持つプロパティである場合のみです。

関連する問題