IValidatableObject and IDataErrorInfo
At the beginning it was IDataErrorInfo. Next , it came IValidatableObject. And , because some GUI frameworks implement one and not other, I must think to a common way to validate once .
My choice was to validate with IValidatableObject and IDataErrorInfo just re-send data.
I made an example with a class User which has UserName, UserEmail and UserPassword.
Without much ado, this is the code:
public class User : IValidatableObject, IDataErrorInfo { public string UserEmail { get; set; } public string UserName { get; set; } public string UserPassword { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (string.IsNullOrEmpty(UserEmail)) yield return new ValidationResult("UserName", new string[1] { "UserName" }); if (string.IsNullOrEmpty(UserEmail)) yield return new ValidationResult("UserEmail", new string[1] { "UserEmail" }); if (string.IsNullOrEmpty(UserEmail)) yield return new ValidationResult("UserPassword", new string[1] { "UserPassword" }); } //IDataErrorInfo - you can copy this code to each class public string Error { get { return this[""]; } } public string this[string columnName] { get { string ret = null; var data = this.Validate(new ValidationContext(this, null, null)); switch (columnName) { case "": foreach (var item in data) { ret += item.ErrorMessage + Environment.NewLine; } break; default: foreach (var item in data) { if (item.MemberNames.Contains(columnName)) ret += item.ErrorMessage + Environment.NewLine; } break; } return ret; } } }
And you can verify like this:
User u = new User(); Console.WriteLine("-----from IDataErrorInfo"); string err = (u as IDataErrorInfo)[""]; Console.WriteLine(err); Console.WriteLine("-----from IvalidatableObject"); foreach(var item in (u as IValidatableObject).Validate(new ValidationContext(u, null, null))) { Console.WriteLine(item.MemberNames.First()); } Console.WriteLine("-----from Validator"); try { Validator.ValidateObject(u, new ValidationContext(u, null, null), true); } catch (ValidationException EX) { Console.WriteLine("JUST " + EX.Message); }
You can find the code also there
Validation
Interesant – din pacate, cate proiecte am vazut, tot atatea stiluri de validare..
Please make a blog post about those 😉