如何使用[必需]属性&;Web Api Put中的模型状态验证

如何使用[必需]属性&;Web Api Put中的模型状态验证,api,asp.net-mvc-4,asp.net-web-api,wcf-web-api,Api,Asp.net Mvc 4,Asp.net Web Api,Wcf Web Api,目前我面临一个问题,当试图从MVCAPI客户端调用WebAPI put方法时,让我们描述一下我的代码结构 测试模型(Web Api端) Web Api放置方法 public sealed class Test { [Required] public int Id { get; set; } [Required] public string Name { get; set; } } public HttpR

目前我面临一个问题,当试图从MVCAPI客户端调用WebAPI put方法时,让我们描述一下我的代码结构

测试模型(Web Api端)

Web Api放置方法

 public sealed class Test    
    {
        [Required]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
    }
public HttpResponseMessage Put(string token, IEnumerable<Test> data)
{
     [...]
     return Request.CreateResponse(HttpStatusCode.OK);
}
但是当我从测试模型(Web Api端)中删除
[必需]
时。然后,上述客户机代码成功执行


请告诉我这种令人困惑的行为的原因是什么

您面临的问题可能是因为在数据验证时默认配置的行为。您在不可为null的类型上有一个属性化的
Required
,由于
int
不能为null,因此如果传入请求未提供值,它将始终具有一个值(默认值为
0

在这些情况下,模型验证器将抛出异常,因为在不能为null的属性上具有
Required
属性是没有意义的

最简单的方法是更改MVC应用程序的设置:

DataAnnotationsModelValidatorProvider
    .AddImplicitRequiredAttributeForValueTypes = false;
这将消除框架抛出的错误。这就带来了一个问题,即即使请求不包含属性,您也会得到一个值
0
。将整数设置为
可空
,这样做更有意义。
Required
属性将能够处理
null
值,您将知道传入请求是否包含该属性

public sealed class Test    
{
    [Required]
    public int? Id { get; set; }
    [Required]
    public string Name { get; set; }
}

为什么要向服务发送
Test
数组?在我的一些项目中,实现ITraceWriter并注册它以查找类似错误的原因非常有用(请参见)。
很好理解,但实际问题不是我的例子中的
public int?
。我把我的项目从4改成了4.5,问题就解决了。上一个使用框架4的项目,出现了一些问题。(令人惊讶,但这是真的)
{StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Pragma: no-cache
  X-SourceFiles: =?UTF-8?B?STpcRGV2QXJlYUxvY2FsXENPTVBBTlkgLSBQU1AgUFJPSkVDVFNcRS1BdXRob3JpdHkgLSBBdXN0cmVsaXlhXFNvdXJjZUNvbnRyb2xcVHJ1bmtcMDYgRGVjIDIwMTNcRS1BdXRob3JpdHkuQXBpIC0gMjAxM1xFYXV0aG9yaXR5LldlYi5BcGkuUHJlc2VudGF0aW9uTGF5ZXJcYXBpXFNtc2ZBY2NvdW50VmVyZmljYXRpb24=?=
  Cache-Control: no-cache
  Date: Mon, 14 Apr 2014 11:23:27 GMT
  Server: Microsoft-IIS/8.0
  Content-Length: 2179
  Content-Type: application/json; charset=utf-8
  Expires: -1
}}
DataAnnotationsModelValidatorProvider
    .AddImplicitRequiredAttributeForValueTypes = false;
public sealed class Test    
{
    [Required]
    public int? Id { get; set; }
    [Required]
    public string Name { get; set; }
}