使用Data批注时,ModelState.IsValid始终为true,MVC为Web API

时间:2018-04-04 19:45:48

标签: .net asp.net-core-mvc data-annotations modelstate

我见过很多像这样的问题,但没有答案解决了我的问题。 我可以提交一个包含空格的名称,或者将描述字段留空,并且ModelState仍然有效。

在我的StartUp.cs中我使用

services.AddMvc();

我没有使用Validator.TryValidateObject尝试,并且Model.State始终有效。

我的班级有数据注释

public class UpdateAttributeResource
    {
        [Required, MaxLength(96), RegularExpression(@"^[A-Za-z0-9~_$\-]*$")]
        public string Name;
        [Required, MaxLength(96)]
        public string DisplayName;
        [Required, MaxLength(160)]
        public string DescriptionEn;
        [Required, MaxLength(160)]
        public string DescriptionFr;
        public string Comments;
    }

我的控制器收到了我的类的集合,即使使用TryValidateObject强制验证,ModelState仍然有效

public IActionResult UpdateAttributes([FromBody]UpdateAttributeResource[] updateAttributes)
{
    var validationContext = new ValidationContext(updateAttributes[0], null, null);
    var validationResults = new List<ValidationResult>();

    var isValid = Validator.TryValidateObject(updateAttributes[0], validationContext, validationResults, true);

    if (!isValid)
    {
        ModelState.AddModelError("NOPE", "Nope");
        return BadRequest(ModelState);
    }

1 个答案:

答案 0 :(得分:4)

我终于在这里找到了答案 DataAnnotations tryvalidateobject always returns true

我不知道为什么它之前没有弹出,无论如何

  

验证器忽略字段上的[RequiredAttribute] - 它需要   进入一个帐户只有属性;

所以我只需要将课程改为

public class UpdateAttributeResource
    {
        [Required, MaxLength(96), RegularExpression(@"^[A-Za-z0-9~_$\-]*$")]
        public string Name { get; set; }
        [Required, MaxLength(96)]
        public string DisplayName { get; set; }
        [Required, MaxLength(160)]
        public string DescriptionEn { get; set; }
        [Required, MaxLength(160)]
        public string DescriptionFr { get; set; }
        public string Comments;
    }