如果没有发送任何内容,验证将无法工作?

5
我将我的模型注释为以下内容:

我对我的模型进行了如下注释:

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方法时,如果没有发送任何内容,则值为null,但是Model.State为true。如果什么都没有发送,状态怎么可能为true呢?下一个问题是,在调用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: 我的问题。我发送了一个没有信息的POST请求,ModelState.IsValid为true。这似乎非常奇怪,我想知道原因。谢谢大家的回答。

enter image description here


可能是ModelState is valid with null model的重复问题。 - Andriy Tolstoy
1个回答

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之前需要提供一个检查以查看项目是否为空。
更多细节请参阅此答案:ModelState.IsValid even when it should not be?

你可能会出现“低贴数”问题,这可能会导致模型状态出现问题。这就是为什么你需要展示你正在发布的JSON数据。即使你发布的是“空”的数据,它仍然是有意义的。 - David East
我使用 Fiddler,没有在 body 中添加任何内容,因此没有 json 可以发布。使用 postman 且没有 body 时,结果相同。我只是试图理解它。即使字段不存在,“Under posting” 应该返回 false 以进行 IsValid 检查。在我的情况下,什么都没有(??)。 - Raul
在您的控制器方法上放置一个断点。然后将鼠标悬停在方法中的参数上,以查看来自对象的值。拍下这些值的截图。另外,请检查我的更新答案,您可能需要在发布“nothing”时更改内容类型。 - David East
参数值正如我所预期的那样为空,因此我无法悬停在这些值上。对我来说,如果参数为空,则返回true作为IsValid是不合逻辑的。有没有办法告诉验证将null值视为无效模型? - Raul
我也道歉。一开始我以为这是一个“低质量发布”问题,因为我没有读清楚。 - David East
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接