我将我的模型注释为:
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。
案例2 我发布了一个缺少必填字段的值(DBServer),然后一切都按预期工作。 ModelState.IsValid为false。
案例3 我的问题。我发送没有信息的帖子请求,ModelState.IsValid为true。这看起来很奇怪,我想知道原因。谢谢大家的答案。
答案 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?