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

时间:2014-04-14 14:35:41

标签: api asp.net-mvc-4 asp.net-web-api wcf-web-api

目前我正面临一个问题,当尝试从MVC Api Client调用Web Api put方法时,让我们来描述我的代码结构

测试模型(Web Api结束)

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

Web Api PUT方法

public HttpResponseMessage Put(string token, IEnumerable<Test> data)
{
     [...]
     return Request.CreateResponse(HttpStatusCode.OK);
}

网络Api自定义过滤器

 public sealed class ValidateFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (!actionContext.ModelState.IsValid)
            {
                actionContext.Response = actionContext.Request.CreateErrorResponse(
                    HttpStatusCode.BadRequest, actionContext.ModelState);
            }
        }

    }

从网络Api客户端调用

async System.Threading.Tasks.Task VerifiedFAccount()
        {
            using (var client = GetHttpClient())
            {
                var url = string.Concat("/api/Verfication", "?token=", token);

                var data = new SampleTest { Id = 1, Name = "xxx" };
                var temp = new List<SampleTest>();
                temp.Add(data);
                using (HttpResponseMessage response = await client.PutAsJsonAsync
                <IEnumerable<SampleTest>>(url, temp).ConfigureAwait(false))
                {
                    if (response.IsSuccessStatusCode)
                    {


                    }
                }
            }

客户端代码无法执行Api调用(即使我将调试点放在Web Api Put方法中,无法点击调试点)&amp;总是得到波纹管错误响应

{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
}}

但是当我从测试模型(Web Api结束)中删除[Required]时。然后上面描述的客户端代码执行成功。

请告诉我这种混淆行为的原因是什么?

1 个答案:

答案 0 :(得分:2)

您面临的问题可能是由于数据验证时默认配置的行为。您有Required归因于非可空类型,并且int不能为空,如果传入请求不是,则它将始终具有值(默认值为0)提供价值。

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

您可以直接更改MVC应用程序的设置:

DataAnnotationsModelValidatorProvider
    .AddImplicitRequiredAttributeForValueTypes = false;

这将消除框架引发的错误。这引入了一个问题,即使请求不包含属性,您将获得0的值。让整数为Nullable<int>更有意义。 Required属性将能够处理null值,您将知道传入请求是否包含属性

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