首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET Framework >

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

2012-01-07 
求Validator.TryValidateObject真相……普通Winform + EntityFramework(另有Silverlight版本,SilverLight验

求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;
}

热点排行