如何使用[必需]属性&;Web Api Put中的模型状态验证
目前我面临一个问题,当试图从MVCAPI客户端调用WebAPI put方法时,让我们描述一下我的代码结构 测试模型(Web Api端) Web Api放置方法如何使用[必需]属性&;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
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; }
}