我有以下内容:
[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。
答案 0 :(得分:5)
区别在于RequiredAttribute
仅用于模型验证,因为IsRequired
的{{1}}属性是序列化程序的提示,表示“在序列化或反序列化时,此属性应始终存在“。
DataMemberAttribute
对ModelStateDictionary.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
来确定它是否为与请求一起发送。