Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用N层实体框架在WinForms中显示数据批注错误消息_C#_Entity Framework_Data Annotations_N Tier Architecture_Client Side Validation - Fatal编程技术网

C# 使用N层实体框架在WinForms中显示数据批注错误消息

C# 使用N层实体框架在WinForms中显示数据批注错误消息,c#,entity-framework,data-annotations,n-tier-architecture,client-side-validation,C#,Entity Framework,Data Annotations,N Tier Architecture,Client Side Validation,请注意,我将N层实体框架()与(WCF)SmartClient Winforms应用程序一起使用。使用数据注释来执行客户端验证,我希望(模仿MVC)选择在用户键入值时立即向用户显示数据注释错误消息,和/或选择在用户单击“保存”按钮时等待显示所有实体属性的所有错误消息(可能使用Validator.TryValidateObject),但在调用context.SaveChanges()之前 当前,当属性值更改并且用户尝试更改控制焦点时,将执行Entity OnPropertyChange()方法,检

请注意,我将N层实体框架()与(WCF)SmartClient Winforms应用程序一起使用。使用数据注释来执行客户端验证,我希望(模仿MVC)选择在用户键入值时立即向用户显示数据注释错误消息,和/或选择在用户单击“保存”按钮时等待显示所有实体属性的所有错误消息(可能使用Validator.TryValidateObject),但在调用context.SaveChanges()之前

当前,当属性值更改并且用户尝试更改控制焦点时,将执行Entity OnPropertyChange()方法,检查属性是否有效(ValidateProperty()),如果验证失败(由于数据注释)抛出异常,控件不会失去焦点,但不会传递/显示异常/错误消息

如何获取可用于客户端验证的数据批注错误消息


@Christofsen您有什么建议吗?

N-Tier实体框架提供多种验证机制:

  • 设置属性值时执行的早期验证,如果无效则抛出,并防止实际设置无效值(默认情况下启用)
  • IDataErrorInfo允许您验证属性的当前值(需要IsValidationEnabled=false才能在属性上实际设置无效)
  • ValidateProperty(string propertyName,object value)允许在不实际尝试将值应用于属性的情况下验证值

  • 在您的情况下,我假设您需要设置IsValidationEnabled=false,因为othervise WinForms数据绑定首先无法设置无效值,然后使用IDataErrorInfo接口无法返回任何验证错误,因为该值未实际设置。DataContext、EntitySet和Entity上都有IsValidationEnabled属性级别。

    @Christofsen我感谢您的回复

    1) 为了利用控件/属性的早期验证,我们使用BindingSource控件的BindingComplete事件来显示验证异常(数据注释错误消息)

    2) 为了利用IDataErrorInfo,我们设置了IsValidationEnabled=false,并编写了以下代码以获取数据注释错误消息字符串。请让我知道是否有其他方式使用IDataErrorInfo

    context.EntitySet.IsValidationEnabled=false
    NTier.Common.Domain.Model.Entity tempEntity=(NTier.Common.Domain.Model.Entity)entityName; 字符串errorMessages=((System.ComponentModel.IDataErrorInfo)tempEntity)错误; //其中errorMessages包含一个数据注释错误消息字符串


    3) 通过使用entity.ValidateProperty(propertyName,propertyValue)并捕获异常,我们可以成功获取数据批注错误消息。

    如果您使用Winforms并希望自定义绑定,则需要更改属性DataSourceUpdateMode.OnPropertyChanged。见答案