我们如何从ModelState中获取验证规则?

问题描述 投票:1回答:1

有没有办法从ModelState字典中获取验证规则,例如

在我的模型中,我有以下数据注释属性。

[StringLength(64, MinimumLength = 8, ErrorMessage = "{0} must be between {2} to {1} characters")]
public string Password { get; set; }

因此,在验证 Modelstate 能否 MinimumLengthMaximumLenght?

我想发送这两个值作为响应,这样前端就可以使用这些值生成本地化消息。

我的响应示例如下

{
  "errorCode" : 1234,
  "message": : "Password must be between 8 to 64 characters",
  "args" : ["8","64"]
}

因此,使用这个错误代码,前端可以使用以下方法生成本地化消息 args.

c# asp.net-core data-annotations asp.net-core-3.1 modelstate
1个回答
1
投票

即使我们在模型中添加了 ConfigureApiBehaviorOptions 该对象不包含验证规则,我建议最简单的方法是在你的字符串里面做一个json对象,像这样你就可以直接使用你想要的格式。

 [StringLength(64, MinimumLength = 8, ErrorMessage = "{{error:'{0} must be between {2} to {1} characters ',args:'[{1},{2}]' }}") ]

1
投票

您可以使用 Reflection 来达到你的要求,正如 @Józef Podlecki 所说。

你也可以参考 这个.

这里有一个通用的方法来实现。

  public class PerInfo
    {
        [StringLength(64, MinimumLength = 8, ErrorMessage = "{0} must be between {2} to {1} characters")]
        public string Password { get; set; }
    }

根据你提供的响应格式,你可以创建一个错误模型。

 public class CusError
    {
        public long errorCode { get; set; }
        public string message { get; set; }
        public string[] args { get; set; }
    }

代码:

 [HttpPost]
        public IActionResult Validate(PerInfo perInfo)
        {
            if (!ModelState.IsValid)
            {
                var error = GenerateValidationModel<PerInfo>();
                return BadRequest(error);
            }
            return Ok();
        }

        private CusError GenerateValidationModel<T>()
        {
            var error = new CusError();
            foreach (var prop in typeof(T).GetProperties())
            {
                object[] attrs = prop.GetCustomAttributes(true);
                if (attrs == null || attrs.Length == 0)
                    continue;
                foreach (Attribute attr in attrs)
                {
                    if (attr is StringLengthAttribute)
                    {
                        error.errorCode = 1234;
                        error.message = string.Format((attr as StringLengthAttribute).ErrorMessage, prop.Name, (attr as StringLengthAttribute).MaximumLength.ToString(), (attr as StringLengthAttribute).MinimumLength.ToString());
                        error.args = new string[] { (attr as StringLengthAttribute).MinimumLength.ToString(), (attr as StringLengthAttribute).MaximumLength.ToString() };
                    }

                }
            }
            return error;
        }

这里是邮递员的测试结果

enter image description here


0
投票

那么在验证Modelstate的时候,我们可以得到MinimumLength和MaximumLenght吗?

你可以从模型类型中获取属性值,用 反思.

var type = ViewModel.GetType()
var properties = type.GetProperties();
foreach (var property in properties)
    {
        var attributes = property.GetCustomAttributes(true);
        foreach (object attribute in attributes)
        {
            var stringLengthAttribute = attribute as StringLengthAttribute;
            if (stringLengthAttribute == null)
            {
              continue;
            }

            var maximumLength = stringLengthAttribute.MaximumLength;
            var minimumLength = stringLengthAttribute.MinimumLength;
        }
    }

© www.soinside.com 2019 - 2024. All rights reserved.