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——有效请求不需要其他两个属性。

然后我试图告诉 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

编辑:

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

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。您要么VideoModel作为 int 离开并将 0 视为特殊值(但是,您将如何区分真正发送的请求0),或者您使用int?.HasValue它来知道它是否与请求一起发送。

于 2013-08-22T18:38:00.437 回答