有沒有什麼辦法可以在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. 添加數據驗證與IValidatableObject實體框架實體在WPF和C#
- 2. 實體框架 - DataAnnotations
- 3. 數據庫優先和Wpf實體框架驗證
- 4. 使用MVVM和實體框架4.0驗證WPF用戶輸入
- 5. 使用數據註釋驗證器與實體框架
- 6. 使用實體框架和WPF/Silverlight或ASP.Net驗證
- 7. 使用MVVM-Light WPF和Linq到實體框架進行數據驗證
- 8. 實體框架中的數據驗證
- 9. 實體框架外鍵DataAnnotations
- 10. 用於驗證實體框架實體的數據註釋
- 11. 使用實體框架MVVM驗證
- 12. 使用WinForms實體框架UI驗證
- 13. MVC驗證基礎(與實體框架)
- 14. 如何與實體框架驗證
- 15. 實體框架6模型使用WPF的第一個數據驗證
- 16. 實體框架驗證
- 17. 使用實體框架數據模型添加驗證屬性
- 18. 使用實體框架進行數據驗證
- 19. 使用數據源和實體框架
- 20. 實體框架v4和wpf
- 21. 實體框架4和WPF
- 22. 使用實體框架和WPF DataGrid的雙向數據綁定
- 23. 實體框架中的整數驗證
- 24. WPF驗證框架
- 25. 實體框架數據庫首先POCO T4生成和驗證
- 26. 實體框架對本地和數據庫的唯一驗證
- 27. ASP.NET MVC和實體框架:生成的數據驗證
- 28. 首先在實體框架代碼中實現數據驗證
- 29. 使用元數據與實體框架使用數據標註
- 30. 實體框架和模型/我剛使用實體框架是第一次使用這個例子驗證
我有一個與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