如果没有发送任何内容,验证无效?

时间:2013-12-27 13:35:43

标签: c# asp.net-web-api

我将我的模型注释为:

public class Instance
{
    [Required]
    public string Name { get; set; }
    public string Description { get; set; }
    [Required]
    public string DBServer { get; set; }
    [Required]
    public string Database { get; set; }
}

在post方法中,如果没有发送任何内容但Model.State为true,则为值获取null。如果没有发送任何东西,国家怎么可能是真的?下一个问题是CreateErrorResponse方法在我调用它时会引发异常(可能是因为该值为null)。

public HttpResponseMessage Post([FromBody]Instance value)
{
    if (value != null && ModelState.IsValid)
    {
        ...
    }
    else
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}

修改 因为我似乎没有解释得对。我现在尝试一些截图。

案例1 我使用Fiddle发布了一个正确的值,一切都按预期工作。 ModelState.IsValid为true。 Valid parameter

案例2 我发布了一个缺少必填字段的值(DBServer),然后一切都按预期工作。 ModelState.IsValid为false。

Missing required field

案例3 我的问题。我发送没有信息的帖子请求,ModelState.IsValid为true。这看起来很奇怪,我想知道原因。谢谢大家的答案。

enter image description here

1 个答案:

答案 0 :(得分:5)

尝试将ModelState检查抽象为过滤器。您不必每次都以这种方式检查ModelState以及是否存在问题

以下代码来自WebAPI中关于ModelState的精彩文章:

http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Http.ModelBinding;

namespace MyApi.Filters
{
    public class ValidateModelAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (actionContext.ModelState.IsValid == false)
            {
                actionContext.Response = actionContext.Request.CreateErrorResponse(
                    HttpStatusCode.BadRequest, actionContext.ModelState);
            }
        }
    }
}

但是,您需要知道的是 ModelState仅检查内部值,因此您需要在调用ModelState之前提供检查以查看该项是否为null。

查看此答案以获取更多详细信息:ModelState.IsValid even when it should not be?