模型验证——为什么是ModelState.IsValid总是返回true,即使没有提供任何值

本文关键字:任何值 返回 为什么 验证 ModelState IsValid 模型 true | 更新日期: 2023-09-27 18:08:59

这是关于WEBAPI和以下是我的模型类。

    public class Request
    {
        public int Id { get; set; }
        public string Name { get; set; }
        [Required]
        public Gender Gender { get; set; }
    }

控制器函数(POST)

public class Values1Controller : ApiController
    {
        public IHttpActionResult Post([FromBody] Models.Request request)
        {
            if (!ModelState.IsValid)
            {
               return BadRequest();
            }
            var gender = request.Gender;
            var id = request.Id;
            var name = request.Name;
            // do some operations!
            return Ok();
        }
    }

和我随每个请求一起提交的xml。

<Request xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns="http://schemas.datacontract.org/2004/07/webapi1.Models">
  <id>1</id>
  <name>testName</name>      
</Request>

在上面的XML post数据中,我根本没有提供Gender的值,它被标记为[required]

但是ModelState.IsValid返回true,即使在上面的XML中没有值Gender .

如何防止WebAPI在模型中分配默认值给枚举?

模型验证——为什么是ModelState.IsValid总是返回true,即使没有提供任何值

我不知道为什么你的模型是有效的,如果你不提供性别,但你可以使这个值没有一个默认值,通过定义性别值为空,如下:

public class Request
{
    public int id { get; set; }
    public string Name { get; set; }
    [Required]
    public Gender? Gender { get; set; }
}

也可以为性别指定一个默认值,如下所示:

public enum Gender
{
    Unknown = 0,
    Male,
    Female
} 

现在我可以看到我们的结果之间的差异,再次使用Postman,如果我以xml形式提交一个原始请求:

Header: Content-Type text/xml

<Request xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://schemas.datacontract.org/2004/07/webapi1.Models">
    <id>1</id>
    <Name>testName</Name>      
</Request>

我的模型是有效的,但是如果我提交x-www-form-urlencoded数据:

Header: Content-Type application/x-www-form-urlencoded

id=1,Name=testname

那么我的模型是无效的,即使值类型有一个值,我的modelstate告诉我需要Gender属性。

由于x-www-form-urlencoded是查询字符串的一部分,那么我猜MVC能够确定该值缺失,但是当数据作为纯xml提交时,它无法确定这一点。

我建议,如果您希望所需的属性在所有情况下都能工作,您可以使您的值类型为空,如下所示:

[Required]
public Gender? Gender { get; set; }

您刚刚输入了Required验证,但是您没有像这样检查值:

[RegularExpression("^[0-9]*$", ErrorMessage = "Your fill the wrong content!")]

,如果你想在保存前设置默认值,你可以在你的类中这样做:

public Request()
    {
        Gender = "male";
        Name = "default name"
    }

希望能帮到你!