ModelState.IsValid 在使用数据注释时始终为真,MVC 作为 Web API

ModelState.IsValid is always true while using Data annotation, MVC as Web API

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

在我的 StartUp.cs 中我使用

services.AddMvc();

我试过没有 Validator.TryValidateObject,Model.State 总是有效的。

我的class有数据标注

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;
    }

我的控制器接收到我的 class 的集合,即使在使用 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);
    }

其实我终于在这里找到了答案

之前不知道为什么不弹出,反正

The validator ignores the [RequiredAttribute] on fields - it takes into an account only properties;

所以我只需要将 class 更改为

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;
    }