c# - IDataErrorInfo 和对象的属性验证

标签 c# design-patterns .net-3.5

自从我尝试学习 WPF 以来,我看到越来越多地使用接口(interface) IDataErrorInfo 将错误绑定(bind)到接口(interface)。我的问题是,我通常将数据的验证放在属性的 setter 中,而不是放在像 IDataErrorInfo.this[string columnName] 这样的方法中...这是一个 blog我发现这让我很困惑。

在 .Net 3.5 中验证数据对象的好方法是什么?我是否需要在 Setter 和 IDataErrorInfo 调用的方法中实现验证?或者只是 IDataErrorInfo?或者在setter中调用IDataErrorInfo?

示例:我有一个名字字符串,只能包含 3 到 50 个字符。我是否将字符串验证放在 setter 中(我通常会这样做),或者现在我可以简单地使用 IDataErrorINfo.this 方法,检查属性名称并在数据长度不合适时返回字符串错误?我发现在 setter 中抛出错误而不使用 Interface 更直观,但我看到的大多数示例都使用 IDataErrorInfo 接口(interface)。

最佳答案

如果您在 setter 中引发异常,则 IDataErrorInfo 是多余的,因为它(理论上)无法进入非法状态。 IDataErrorInfo 允许您接受所有输入,但告诉用户存在问题。这样做的好处是,它可以减少对 UI 的干扰(因为即使一个字段出错并被标记为错误,用户也可以继续输入数据),并且很容易报告多个立即出错 - 视觉上的,而不是通过消息框等。

但是,如果您采用此方法,则需要确保在将对象保存到数据库等之前验证该对象是否正常。

您可以通过从业务逻辑中检查 .Error 来完成此操作(并检查它是否为 null/empty),假设您编写了 .Error 报告所有错误。或者类似的 Validate() 方法。

关于c# - IDataErrorInfo 和对象的属性验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123140/

相关文章:

c# - Visual Studio 2017 RC - C# UWP 项目 - 无法创建类

ios - 正则表达式在使用 MVC 设计模式的 iOS 应用程序中的什么位置?

Java - 重构几乎相同的方法

c# - 通过 WCF 传递递归集合

c# - 有没有办法将一个计时器用于多个事件?

c# - 使用带有参数的 Oracle 函数将记录集从 Oracle 返回到 .Net

c# - 将 LINQ 查询值传递给跨多个 View 屏幕共享的 View 布局

c# - 从 List<t> 中获取具有特定属性最大值的记录

c# - 使用 EF 4.0 从 Azure 网站连接到 SQL Azure

c# - 在 .NET 中使用来自另一个程序集的抽象类