4

Web APIを使用してAPIを構築していますが、投稿された値を受け取ってモデルにバインドすると、場違いのように見えるエラーが発生します。

私は以下のような単純なモデルを持っています:

public class Client
{
    [ScaffoldColumn(false)]
    [JsonIgnore]
    public int ClientID { get; set; }
    [Required, StringLength(75)]
    public string Name { get; set; }
    [Required]
    public bool Active { get; set; }
}

このモデルをコントローラーのpostメソッドに送信する場合

public object Post([FromBody]Client postedClient)

x-www-form-urlencodedフォーマッターを通過しますが、次のようにスローされます。

Property 'Active' on type 'CreditSearch.Api.Models.Rest.Client' 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)].

同じデータをjson形式で送信しようとしましたが、同じ結果が得られます。コードを機能させるためだけにこれらの属性を追加しようとしましたが、Resharperと私は正しい参照を見つけることができません。それでも、プレーンMVCシステムで検証するときに、これまで必要とされていなかったこの余分な属性を追加したくありません。

  1. これらの属性は本当に必要ですか?以前は必要ありませんでした。
  2. もしそうなら、どのような参照を追加する必要がありますか?
4

1 に答える 1

6

この検証が行われる理由は、参照型のメンバーの場合、メンバーが逆シリアル化されるたびに、WebAPIがメンバーがnullでないことを確認できるためです。値型の場合、null値はないため、値が要求本文に存在するかどうかを確認するのはフォーマッター次第です。残念ながら、私たちのXMLフォーマッターは[Required]属性をサポートしていないため、メンバーが欠落している場合でもモデル状態エラーは発生しません。

欠落している値が入力されたメンバーに対してモデル状態エラーを発生させない特定のフォーマッターに問題がない場合は、次の行を使用して検証を削除できます。

config.Services.RemoveAll(typeof(ModelValidatorProvider), (provider) => provider is InvalidModelValidatorProvider);
于 2012-12-29T08:41:57.397 に答える