代码之家  ›  专栏  ›  技术社区  ›  Chris McCall

如何在非数据库中使用C#中的数据验证属性-ASP.net背景?

  •  29
  • Chris McCall  · 技术社区  · 14 年前

    我希望在库程序集中使用数据验证属性,以便数据的任何使用者都可以在不使用ModelBinder的情况下对其进行验证(例如,在控制台应用程序中)。我该怎么做?

    3 回复  |  直到 14 年前
        1
  •  52
  •   mantal    10 年前

    实际上这很酷。我最近在WFP验证实现中使用了它。大多数人最终都会使用反射来编写大量的代码来迭代属性,但是有一个内置的函数来实现这一点。

    var vc = new ValidationContext(myObject, null, null);
    return Validator.TryValidateObject(myObject, vc, null, true);
    

    还可以验证单个命名属性的属性。您还可以选择传入列表以访问错误消息:

    var results = new List<ValidationResult>();
    var vc = new ValidationContext(myObject, null, null) { MemberName = "UserName"};
    var isValid = Validator.TryValidateProperty(value, vc, results);
    
    // get all the errors
    var errors = Array.ConvertAll(results.ToArray(), o => o.ErrorMessage);
    
        2
  •  2
  •   Shimmy Weitzhandler 500 - Internal Server Error    7 年前

    这个 System.ComponentModel.DataAnnotations.ValidationAttribute IsValid 执行验证逻辑的方法。它们获取一个对象(它们装饰的字段的值)并返回 true false .

    您可以使用这些属性和一些反射来运行您自己的面向方面的验证器。向验证器传递一个对象,验证器将获得 PropertyInfo s和 FieldInfo GetCustomAttributes 寻找那些继承自 ValidationAttribute ,对于每一个,调用 ,传递属性或字段的值。这可以完全动态地完成,而不需要知道在设计时要验证的类的结构。

        3
  •  0
  •   Chris Moschini    6 年前

    TryValidateProperty

    我放弃了,只写了我自己的验证器。这将在任何上下文中循环任何对象集,并告诉您它们是否有效:

    bool isValid = true;
    var invalidFields = new List<string>();
    
    foreach (var o in viewModels)
    {
        var properties = o.GetType()
            .GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach(var prop in properties)
        {
            var attrs = prop.GetCustomAttributes(true);
            if (attrs != null)
            {
                var val = prop.GetValue(o);
                ValidationAttribute[] validatorAttrs = attrs
                    .Where(a => a is ValidationAttribute)
                    .Select(a => (ValidationAttribute)a).ToArray();
    
                foreach(var attr in validatorAttrs)
                {                       
                    bool thisFieldIsValid = attr.IsValid(val);
                    if (!thisFieldIsValid)
                        invalidFields.Add(prop.Name);
    
                    isValid = isValid && thisFieldIsValid;
                }
            }
        }
    }