
这是一个示例代码:
[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不验证类?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)