我对MSDN example感到有些困惑。
目前尚不清楚如何处理和设置实体出现的错误。
示例中的代码:
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (String.IsNullOrEmpty(propertyName) ||
!errors.ContainsKey(propertyName)) return null;
return errors[propertyName];
}
但GetErrors()的文档声明:
propertyName - 要检索验证错误的属性的名称 对于; 或null或Empty,以检索实体级错误。
另一个例子表明只返回字典的_errors.Values。这只是所有属性错误,但同样不是实体错误。
答案 0 :(得分:2)
根据文档中的“备注”部分:MSDN: INotifyDataErrorInfo Interface
此接口使数据实体类能够实现自定义 验证规则并异步公开验证结果。这个 接口还支持自定义错误对象,每个错误多个 属性,跨属性错误和实体级错误。 跨属性错误是影响多个属性的错误。您 可以将这些错误与一个或所有受影响的属性相关联, 或者您可以将它们视为实体级错误。实体级错误是 错误会影响多个属性或影响整个属性 实体,不影响特定财产。
我可能会建议GetErrors
的实现高度依赖于您的错误处理方案。例如,如果您不打算支持Entity-Level
错误,那么您的示例代码就足够了。但是,如果您确实需要支持Entity-Level
错误,那么您可以单独处理IsNullOrEmpty
条件:
Public IEnumerable GetErrors(String propertyName)
{
if (String.IsNullOrEmpty(propertyName))
return entity_errors;
if (!property_errors.ContainsKey(propertyName))
return null;
return property_errors[propertyName];
}
答案 1 :(得分:1)
由于在我的解决方案中找不到合适的答案,因此,如果该值为null或为空,则会返回所有验证错误:
private ConcurrentDictionary<string, List<ValidationResult>> modelErrors = new ConcurrentDictionary<string, List<ValidationResult>>();
public bool HasErrors { get => modelErrors.Any(); }
public IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
{
return modelErrors.Values.SelectMany(x => x); // return all errors
}
modelErrors.TryGetValue(propertyName, out var propertyErrors);
return propertyErrors;
}