当前位置: 代码迷 >> .NET Framework >> 求Validator.TryValidateObject真相…该如何解决
  详细解决方案

求Validator.TryValidateObject真相…该如何解决

热度:387   发布时间:2016-05-02 01:05:55.0
求Validator.TryValidateObject真相……
普通Winform + EntityFramework
(另有Silverlight版本,SilverLight验证都正确,证明我的metadata应该也没问题)

metadata:
C# code
    [MetadataType(typeof(Employee.EmployeeMetadata))]    public partial class Employee    {        internal sealed class EmployeeMetadata        {            [Display(Name = "用户编号", Order = 0, Description = "用户的唯一编号标志")]            [Required(ErrorMessage = "用户编号自动生成")]            [Editable(false)]            public global::System.Int32 PersonnelID;            [Display(Name = "名字", Order = 1, Description = "名字部分")]            [Required(ErrorMessage = "必须输入名字")]            [Editable(true)]            [StringLength(20)]            public global::System.String Firstname;            //...以下属性省略        }    }


使用的地方:
C# code
            Employee mod = new Employee();            //...赋值赋值,从UI拿数据            ValidationContext vc = new ValidationContext(mod, null, null);            var validationResults = new List<ValidationResult>();            Validator.TryValidateObject(mod, vc, validationResults, true);            //就这里,无论我属性是什么他都没出错记录。            //比如我Firstname设置成了“我们是党的好儿女,我们坚决拥护党的领导和决策,现在已经很多字了……反正就是比20长很多很多……”都不会报错。



求真相,是不是我用法错了?

------解决方案--------------------

public static ICollection<ValidationResult> Validate(object instance)
{
var validationResults = new List<ValidationResult>();
MetadataTypeAttribute metaTypeAttr = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true)
.OfType<MetadataTypeAttribute>().FirstOrDefault();

if (metaTypeAttr == null) return validationResults;

TypeDescriptor.AddProvider(
new AssociatedMetadataTypeTypeDescriptionProvider(instance.GetType(), metaTypeAttr.MetadataClassType),
instance.GetType());

ValidationContext vc = new ValidationContext(instance, null, null);
Validator.TryValidateObject(instance, vc, validationResults, true);

return validationResults;
}
  相关解决方案