如何使用INotifyDataErrorInfo在单个方法中return包含错误的属性?
How to return the property that contains an error in a single method using INotifyDataErrorInfo?
问题
我能够为每个 属性 使用它自己的单独方法实施验证。我遇到的问题是,代码太多,每个方法都有太多方法 属性 - 我的目标是将所有方法都变成一个方法。
我现在遇到了一个问题,关于如何在我的单一方法中识别哪个 属性 包含错误。
服务
在这里,我构建了用于检查 User
属性.
中的用户名和密码的服务
public interface ILoginValidationService
{
bool ValidateUser(UserModel user, out ICollection<string> errors);
}
public class LoginValidationService : ILoginValidationService
{
public bool ValidateUser(UserModel user, out ICollection<string> errors)
{
errors = new List<string>();
if (string.IsNullOrWhiteSpace(user.FirstName))
{
errors.Add("First Name cannot be empty");
}
if (string.IsNullOrWhiteSpace(user.LastName))
{
errors.Add("Last Name cannot be empty");
}
return errors.Count == 0;
}
}
实际验证
在这里,我创建了 2 个方法 Validation
和 ValidateUser
,它们采用 UserModel
.
的单个参数
Validation
方法创建一个新的 UserModel 对象,从 TextBox 绑定到的 public 属性中获取 FirstName
和 LastName
。然后它调用 ValidateUser(user)
传递用户对象。
在ValidateUser
方法中,是我遇到问题的地方。
此方法目前以FirstName
var prop = nameof(FirstName);
的属性为例
接下来,您将看到 bool isValid
属性,这会验证用户。
它进行验证,returns var prop = nameof(FirstName);
中提到的 FirstName
的错误,这里是输出:查看代码下方的图像
private ILoginValidationService ValidationService { get; set; }
private bool Validation()
{
UserModel user = new UserModel
{
FirstName = FirstName,
LastName = LastName
};
ValidateUser(user);
return _validationErrors.Count == 0 ? false : true;
}
private void ValidateUser(UserModel user)
{
var prop = nameof(FirstName);
ICollection<string> validationErrors = null;
bool isValid = ValidationService.ValidateUser(user, out validationErrors);
if (!isValid)
{
_validationErrors[prop] = validationErrors;
RaiseErrorsChanged(prop);
}
else if (_validationErrors.ContainsKey(prop))
{
_validationErrors.Remove(prop);
RaiseErrorsChanged(prop);
}
}
#region INotifyDataErrorInfo members
private readonly Dictionary<string, ICollection<string>> _validationErrors = new Dictionary<string, ICollection<string>>();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
private void RaiseErrorsChanged(string propertyName)
{
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
public IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName)
|| !_validationErrors.ContainsKey(propertyName))
return null;
return _validationErrors[propertyName];
}
public bool HasErrors
{
get { return _validationErrors.Count > 0; }
}
#endregion
输出
它的作用是在 FirstName
.
下方显示错误
问题
我目前有 var prop = nameof(FirstName);
的地方,我如何根据 bool isValid = ValidationService.ValidateUser(user, out validationErrors);
确定哪个 属性 有错误?并显示与其相关的错误 属性?
您可以考虑创建自己的 class 来报告错误,而不是使用 ICollection 和字符串。
像这样简单的东西:
class ErrorInformation
{
public string PropertyName {get;}
public string Message {get;}
}
在 ValidateUser 中,您可以添加 ErroInformation 的实例,而不是将字符串添加到您的集合中。
问题
我能够为每个 属性 使用它自己的单独方法实施验证。我遇到的问题是,代码太多,每个方法都有太多方法 属性 - 我的目标是将所有方法都变成一个方法。
我现在遇到了一个问题,关于如何在我的单一方法中识别哪个 属性 包含错误。
服务
在这里,我构建了用于检查 User
属性.
public interface ILoginValidationService
{
bool ValidateUser(UserModel user, out ICollection<string> errors);
}
public class LoginValidationService : ILoginValidationService
{
public bool ValidateUser(UserModel user, out ICollection<string> errors)
{
errors = new List<string>();
if (string.IsNullOrWhiteSpace(user.FirstName))
{
errors.Add("First Name cannot be empty");
}
if (string.IsNullOrWhiteSpace(user.LastName))
{
errors.Add("Last Name cannot be empty");
}
return errors.Count == 0;
}
}
实际验证
在这里,我创建了 2 个方法 Validation
和 ValidateUser
,它们采用 UserModel
.
Validation
方法创建一个新的 UserModel 对象,从 TextBox 绑定到的 public 属性中获取 FirstName
和 LastName
。然后它调用 ValidateUser(user)
传递用户对象。
在ValidateUser
方法中,是我遇到问题的地方。
此方法目前以FirstName
var prop = nameof(FirstName);
的属性为例
接下来,您将看到 bool isValid
属性,这会验证用户。
它进行验证,returns var prop = nameof(FirstName);
中提到的 FirstName
的错误,这里是输出:查看代码下方的图像
private ILoginValidationService ValidationService { get; set; }
private bool Validation()
{
UserModel user = new UserModel
{
FirstName = FirstName,
LastName = LastName
};
ValidateUser(user);
return _validationErrors.Count == 0 ? false : true;
}
private void ValidateUser(UserModel user)
{
var prop = nameof(FirstName);
ICollection<string> validationErrors = null;
bool isValid = ValidationService.ValidateUser(user, out validationErrors);
if (!isValid)
{
_validationErrors[prop] = validationErrors;
RaiseErrorsChanged(prop);
}
else if (_validationErrors.ContainsKey(prop))
{
_validationErrors.Remove(prop);
RaiseErrorsChanged(prop);
}
}
#region INotifyDataErrorInfo members
private readonly Dictionary<string, ICollection<string>> _validationErrors = new Dictionary<string, ICollection<string>>();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
private void RaiseErrorsChanged(string propertyName)
{
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
public IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName)
|| !_validationErrors.ContainsKey(propertyName))
return null;
return _validationErrors[propertyName];
}
public bool HasErrors
{
get { return _validationErrors.Count > 0; }
}
#endregion
输出
它的作用是在 FirstName
.
问题
我目前有 var prop = nameof(FirstName);
的地方,我如何根据 bool isValid = ValidationService.ValidateUser(user, out validationErrors);
确定哪个 属性 有错误?并显示与其相关的错误 属性?
您可以考虑创建自己的 class 来报告错误,而不是使用 ICollection 和字符串。
像这样简单的东西:
class ErrorInformation
{
public string PropertyName {get;}
public string Message {get;}
}
在 ValidateUser 中,您可以添加 ErroInformation 的实例,而不是将字符串添加到您的集合中。