WebAPI验证装饰 - [DataMember]和[Required]之间的区别?

时间:2013-08-22 18:34:19

标签: entity-framework asp.net-web-api

我有以下内容:

[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,我需要的所有内容都是标题 - 有效请求不需要其他两个属性。

然后我试图告诉Entity Framework / SQL数据库中需要其他属性。我将在我的服务或webapi层中分配它们。

如果我使用以下内容仅发送标题,我会

  

{“$ id”:“1”,“message”:“请求是   无效。“,”modelState“:{”$ id“:”2“,”video.VideoId“:[”一个值是   required。“],”video.UserId“:[”UserId属性是必需的。“]}}

我在这里误解了什么?据我所知,WebAPI不应该关心没有提供videoId。

1 个答案:

答案 0 :(得分:5)

区别在于RequiredAttribute仅用于模型验证,因为IsRequired的{​​{1}}属性是序列化程序的提示,表示“在序列化或反序列化时,此属性应始终存在“。

DataMemberAttributeModelStateDictionary.IsValid属性和一般MVC / Web Api模型验证没有影响。

在您的方案中,您需要RequiredAttribute(或System.ComponentModel.DataAnnotations命名空间中的任何验证属性)

修改

理想情况下,您应该使用适合您的Api端点的不同模型,而不是直接适用于您的Entity Framework模型。因为实体框架代码优先使用与MVC / Web Api相同的属性进行验证,所以如果它们不能一对一翻译,则不能将它们混合使用。在我看来,您应该在控制器中为请求创建一个单独的类。例如:

DataMemberAttribute

请注意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保留,并将0视为特殊值(但是,您将如何区分真正发送VideoModel的请求)或使用0来确定它是否为与请求一起发送。