1

私は次のものを持っています:

[DataContract]
public class Video
{
    [Key]
    [DataMember(IsRequired = false)]
    [Required]
    public int VideoId { get; set; }

    [DataMember(IsRequired = false)]
    [Required]
    public int UserId { get; set; }

    [Required]
    [DataMember(IsRequired=true)]
    public string Title { get; set; }

}

ここでの目標は、DataMember 装飾を介して WebAPI に、ネットワーク上で必要なのは Title だけであることを伝えることです。他の 2 つのプロパティは、有効な要求には必要ありません。

次に、データベースで他のプロパティが必要であることを Entity Framework / SQL に伝えようとしています。サービスまたは webapi レイヤーでそれらを割り当てます。

以下を使用してタイトルのみを送信すると、

{"$id":"1","message":"リクエストが無効です。","modelState":{"$id":"2","video.VideoId":["値が必要です。" ],"video.UserId":["UserId プロパティは必須です。"]}}

ここで私は何を誤解していますか?私の知る限り、WebAPI は videoId が提供されていないことを気にするべきではありません。

4

1 に答える 1

5

違いは、RequiredAttributeがモデルの検証のみに使用されることです。 のIsRequiredプロパティは、DataMemberAttribute「シリアライゼーションまたはデシリアライゼーションの際に、このプロパティは常に存在する必要がある」というシリアライザーへのヒントです。

は、プロパティおよび一般的な MVC / Web Api モデルの検証にDataMemberAttributeは影響しません。ModelStateDictionary.IsValid

あなたのシナリオでは、RequiredAttribute(またはSystem.ComponentModel.DataAnnotations名前空間の検証属性のいずれか)が必要です

編集:

理想的には、Entity Framework のモデルではなく、Api のエンドポイントに適した別のモデルを使用する必要があります。Entity Framework のコードは最初に検証のために MVC / Web Api と同じ属性を使用するため、1 対 1 で変換しないと 2 つを混在させることはできません。私の意見では、コントローラーでリクエスト用に別のクラスを作成する必要があります。例えば:

public class VideoModel
{
    public int? VideoId { get; set; }

    public int? UserId { get; set; }

    [Required]
    public string Title { get; set; }

}

// And your method
public HttpResponseMessage YourAction(VideoModel model)
{
    // Manipulate your model and map them to your Entity Framework's model
}

の使用に注意してくださいint?。それらが必須ではなく、そのままにしてintおくと、デフォルトで になります0。int のままVideoModelにして 0 を特別な値として扱う (ただし、実際に送信されたリクエストをどのように区別するか) か、リクエストと一緒に送信されたかどうかを知るために0使用します。int?.HasValue

于 2013-08-22T18:38:00.437 に答える