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

Rau*_*aul 5 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; }
}
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

编辑: 因为看起来我没有解释得对.我现在尝试一些截图.

案例1 我使用Fiddle发布了正确的值,一切都按预期工作.ModelState.IsValid为true. 有效参数

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

缺少必填字段

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

在此输入图像描述

Dav*_*ast 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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

请查看此答案以获取更多详细信息:ModelState.IsValid即使它不应该是?