有没有什么办法可以在WPF &实体框架中使用DataAnnotations进行验证?使用DataAnnotations与WPF和实体框架验证数据?
回答
您可以使用DataAnnotations。Validator类,如下所述:
但如果您使用的是“伙伴”类的元数据,您需要注册这个事实你前对其进行验证,如下所述:
http://forums.silverlight.net/forums/p/149264/377212.aspx
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(typeof(myEntity),
typeof(myEntityMetadataClass)),
typeof(myEntity));
List<ValidationResult> results = new List<ValidationResult>();
ValidationContext context = new ValidationContext(myEntity, null, null)
bool valid = Validator.TryValidateObject(myEntity, context, results, true);
[增加了以下对摆振的评论作出回应]
我写了一个通用的方法以实现上述的逻辑,以使得任何对象都可以调用它:
// If the class to be validated does not have a separate metadata class, pass
// the same type for both typeparams.
public static bool IsValid<T, U>(this T obj, ref Dictionary<string, string> errors)
{
//If metadata class type has been passed in that's different from the class to be validated, register the association
if (typeof(T) != typeof(U))
{
TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T), typeof(U)), typeof(T));
}
var validationContext = new ValidationContext(obj, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(obj, validationContext, validationResults, true);
if (validationResults.Count > 0 && errors == null)
errors = new Dictionary<string, string>(validationResults.Count);
foreach (var validationResult in validationResults)
{
errors.Add(validationResult.MemberNames.First(), validationResult.ErrorMessage);
}
if (validationResults.Count > 0)
return false;
else
return true;
}
在需要被验证的每个对象,我添加调用此方法:
[MetadataType(typeof(Employee.Metadata))]
public partial class Employee
{
private sealed class Metadata
{
[DisplayName("Email")]
[Email(ErrorMessage = "Please enter a valid email address.")]
public string EmailAddress { get; set; }
}
public bool IsValid(ref Dictionary<string, string> errors)
{
return this.IsValid<Employee, Metadata>(ref errors);
//If the Employee class didn't have a buddy class,
//I'd just pass Employee twice:
//return this.IsValid<Employee, Employee>(ref errors);
}
}
我认为Craigs答案中缺少的是如何实际检查是否存在验证错误。这是由史蒂夫·桑德森对于那些谁想要在输精管层,然后演示运行验证检查书面DataAnnotation验证亚军(http://blog.codeville.net/category/xval/,该代码是在示例项目):
public static IEnumerable<ErrorInfo> GetErrors(object instance)
{
var metadataAttrib = instance.GetType().GetCustomAttributes
(typeof(MetadataTypeAttribute), true).
OfType<MetadataTypeAttribute>().FirstOrDefault();
var buddyClassOrModelClass =
metadataAttrib != null ?
metadataAttrib.MetadataClassType :
instance.GetType();
var buddyClassProperties = TypeDescriptor.GetProperties
(buddyClassOrModelClass).Cast<PropertyDescriptor>();
var modelClassProperties = TypeDescriptor.GetProperties
(instance.GetType()).Cast<PropertyDescriptor>();
return from buddyProp in buddyClassProperties
join modelProp in modelClassProperties
on buddyProp.Name equals modelProp.Name
from attribute in buddyProp.Attributes.
OfType<ValidationAttribute>()
where !attribute.IsValid(modelProp.GetValue(instance))
select new ErrorInfo(buddyProp.Name,
attribute.FormatErrorMessage(string.Empty), instance);
}
我不熟悉的WPF(不知道如果有问题的话可以使用一些现成的解决方案),但也许你可以使用它。
另外,他的博客上有一些评论,在某些情况下,它没有正确评估验证规则,但它从未失败过。
在WPF中,必须根据属性更改来触发它。 – Shimmy 2010-07-22 04:39:06
这是完成它的一个有趣的方式 - 我可以用这些想法修改我的版本(上面)。 – 2010-10-13 17:08:10
我有同样的问题,发现了以下思路:
- Notification Pattern
- Silverlight的的DataForm控制WPF对CodePlex
在.NET 4端口,有验证支持在使用此扩展的实体框架中,请查看:http://blogs.msdn.com/adonet/archive/2010/01/13/introducing-the-portable-extensible-metadata.aspx
我不确定它是否使用数据注释寿。
UPDATE
我用VB.NET尝试过了,也没有工作,我认为它仅支持C#项目。
我已经写了基于贡献者验证器,其包括DataAnnotation验证贡献者,并且还检查针对破碎的绑定(其中用户已输入类型不正确)
http://adammills.wordpress.com/2010/07/21/mvvm-validation-and-type-checking/
你忘记了我正在谈论EDM设计器生成的实体对象。 – Shimmy 2010-07-22 04:43:22
您可能会感兴趣的书籍WPF Application Framework (WAF)的样本应用程序。它完全符合你的要求:在WPF &实体框架中使用DataAnnotations。
- 1. 实体框架 - DataAnnotations
- 2. 使用MVVM和实体框架4.0验证WPF用户输入
- 3. 使用数据注释验证器与实体框架
- 4. 实体框架外键DataAnnotations
- 5. 使用实体框架MVVM验证
- 6. 实体框架验证
- 7. 实体框架4和WPF
- 8. 实体框架v4和wpf
- 9. 使用实体框架和WPF DataGrid的双向数据绑定
- 10. 实体框架数据库首先POCO T4生成和验证
- 11. 使用元数据与实体框架使用数据标注
- 12. 实体框架和模型/我刚使用实体框架是第一次使用这个例子验证
- 13. 实体框架和WPF最佳实践
- 14. 验证实体框架对象从WPF客户端侧
- 15. 实体框架 - 验证文本格式
- 16. 实体框架验证混乱 - 的“128”
- 17. 单元测试实体框架验证
- 18. MVC上的实体框架验证
- 19. 实体框架+验证注释
- 20. WPF数据绑定使用ADO.NET实体框架4
- 21. 与实体框架和EntitiyDataSource
- 22. 实体框架Core在保存时不验证数据吗?
- 23. 刷新数据使用实体框架
- 24. 使用实体框架数据库
- 25. 使用验证程序类验证DataAnnotations
- 26. 实体框架与现有数据库
- 27. 实体框架与数据库优先
- 28. MVC3客户端使用数据库生成的实体框架进行验证
- 29. 实体框架WPF/MVVM
- 30. 实体框架 - 验证(服务器+ clientside,jquery)与数据注释,WITHOUT MVC?
我有一个与MD相关的gazillion类,你对如何动态地将它与MD关联起来有什么好的想法,但是我想按需做,也就是说只有当我要使用这个类时(或者它的验证)和只有一次。 – Shimmy 2010-08-10 03:07:09
@Shimmy - 见上文。 – 2010-10-13 17:04:29
谢谢! 顺便说一句,不需要将字典标记为'ref',因为无论如何您都不会更改引用,只需访问其属性即可。 – Shimmy 2010-10-14 06:15:00