c# – 如果我在属性中有验证属性,为什么Validator.TryValidateObject不验证类?

c# – 如果我在属性中有验证属性,为什么Validator.TryValidateObject不验证类?,第1张

概述我创建了一个针对类的自定义ValidationAttribute.每当我尝试调用Validator.TryValidateObject时,这都会正确验证.但是当我在我的类中的属性中有其他ValidationAttribute时,验证结果不包含类级别验证的结果. 这是一个示例代码: [AttributeUsage(AttributeTargets.Class, AllowMultiple = fal 我创建了一个针对类的自定义ValIDationAttribute.每当我尝试调用ValIDator.TryValIDateObject时,这都会正确验证.但是当我在我的类中的属性中有其他ValIDationAttribute时,验证结果不包含类级别验证的结果.

这是一个示例代码:

[AttributeUsage(AttributeTargets.Class,AllowMultiple = false,inherited = true)]public class IsHelloWorldAttribute : ValIDationAttribute{    public object _typeID = new object();    public string FirstProperty { get; set; }    public string SecondProperty { get; set; }    public IsHelloWorldAttribute(string firstProperty,string secondProperty)    {        this.FirstProperty = firstProperty;        this.SecondProperty = secondProperty;     }    public overrIDe bool IsValID(object value)    {        PropertyDescriptorCollection propertIEs = TypeDescriptor.GetPropertIEs(value);        string str1 = propertIEs.Find(FirstProperty,true).GetValue(value) as string;        string str2 = propertIEs.Find(SecondProperty,true).GetValue(value) as string;        if (string.Format("{0}{1}",str1,str2) == "HelloWorld")            return true;        return false;    }    public overrIDe object TypeID    {        get        {            return _typeID;        }    }}

这是我需要验证的类的代码

[IsHelloWorld("name","Code",ErrorMessage="Is not Hello World")]public class Myviewmodel : Baseviewmodel{    string name;    string code;    [required]    public string name    {        get { return model.name; }        set        {            if (model.name != value)            {                model.name = value;                base.RaisePropertyChanged(() => this.name);            }        }    }            public string Code    {        get { return code; }        set        {            if (code != value)            {                code = value;                base.RaisePropertyChanged(() => this.Code);            }        }    }}

以下是我调用TryValIDateObject方法的方法:

var valIDationContext = new ValIDationContext(this,null,null);                           var valIDationResults = new List<ValIDationResult>();                           ValIDator.TryValIDateObject(this,valIDationContext,valIDationResults,true);

现在,如果我在name属性中有[required]属性并且我尝试调用ValIDator.TryValIDateObject,则验证结果只有一个,这是required验证的结果.但是当我从name中删除[required]属性并离开IsHellowWorld属性然后调用TryValIDateObject时,它会给我一个结果,那就是HellowWorldValIDation的结果.

我需要做的是在类级别和属性级别上获得所有验证.我可以在不实现自己的TryValIDateObject方法的情况下实现这一目标吗?

解决方法 这是因为如果检测到属性错误,则检查被短路.这是有道理的,因为类级别验证可能更昂贵,可能涉及回调,其他数据源调用等.

如果检测到属性错误,那么原来的逻辑就会停止.

在System.ComponentModel.DataAnnotations.ValIDator中:

public static bool TryValIDateObject(object instance,ValIDationContext valIDationContext,ICollection<ValIDationResult> valIDationResults,bool valIDateallPropertIEs)    {      if (instance == null)        throw new ArgumentNullException("instance");      if (valIDationContext != null && instance != valIDationContext.ObjectInstance)        throw new ArgumentException(DataAnnotationsResources.ValIDator_InstanceMustMatchValIDationContextInstance,"instance");      bool flag = true;      bool breakOnFirstError = valIDationResults == null;      foreach (ValIDator.ValIDationError valIDationError in ValIDator.GetobjectValIDationErrors(instance,valIDateallPropertIEs,breakOnFirstError))      {        flag = false;        if (valIDationResults != null)          valIDationResults.Add(valIDationError.ValIDationResult);      }      return flag;    }

请注意对ValIDator.GetobjectValIDationErrors的调用,而ValIDator.GetobjectValIDationErrors又被定义为:

private static IEnumerable<ValIDator.ValIDationError> GetobjectValIDationErrors(object instance,bool valIDateallPropertIEs,bool breakOnFirstError)        {          if (instance == null)            throw new ArgumentNullException("instance");          if (valIDationContext == null)            throw new ArgumentNullException("valIDationContext");          List<ValIDator.ValIDationError> List = new List<ValIDator.ValIDationError>();//Check for property errors here          List.AddRange(ValIDator.GetobjectPropertyValIDationErrors(instance,breakOnFirstError));// Short circuits here if any found          if (Enumerable.Any<ValIDator.ValIDationError>((IEnumerable<ValIDator.ValIDationError>) List))            return (IEnumerable<ValIDator.ValIDationError>) List;// Class level valIDation occurs below this point          IEnumerable<ValIDationAttribute> valIDationAttributes = ValIDator._store.GetTypeValIDationAttributes(valIDationContext);          List.AddRange(ValIDator.GetValIDationErrors(instance,valIDationAttributes,breakOnFirstError));          if (Enumerable.Any<ValIDator.ValIDationError>((IEnumerable<ValIDator.ValIDationError>) List))            return (IEnumerable<ValIDator.ValIDationError>) List;          IValIDatableObject valIDatableObject = instance as IValIDatableObject;          if (valIDatableObject != null)          {            foreach (ValIDationResult valIDationResult in Enumerable.Where<ValIDationResult>(valIDatableObject.ValIDate(valIDationContext),(Func<ValIDationResult,bool>) (r => r != ValIDationResult.Success)))              List.Add(new ValIDator.ValIDationError((ValIDationAttribute) null,instance,valIDationResult));          }          return (IEnumerable<ValIDator.ValIDationError>) List;        }
总结

以上是内存溢出为你收集整理的c# – 如果我在属性中有验证属性,为什么Validator.TryValidateObject不验证类?全部内容,希望文章能够帮你解决c# – 如果我在属性中有验证属性,为什么Validator.TryValidateObject不验证类?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1243288.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存