I have something like this:
[DisplayName(\"First Name\")]
[Required(ErrorMessage=\"{0} is required.\")]
[StringLength(50, MinimumLength = 10, Err
Instead of (or perhaps in conjunction with) using the [DisplayName]
attribute, use the [Display]
attribute in System.ComponentModel.DataAnnotations
. Populate its Name
property.
With that, you can use built-in validation attributes or custom attributes with ValidationContext
's DisplayName
.
e.g.,
[Display(Name="First Name")] // <-- Here
[Required(ErrorMessage="{0} is required.")]
[StringLength(50, MinimumLength = 10, ErrorMessage="{0}'s length should be between {2} and {1}.")]
public string Name { get; set; }
Well, I think I did it.
I had to create another attribute like this:
public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
private String displayName;
public RequiredAttribute()
{
this.ErrorMessage = "{0} is required";
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var attributes = validationContext.ObjectType.GetProperty(validationContext.MemberName).GetCustomAttributes(typeof(DisplayNameAttribute), true);
if (attributes != null)
this.displayName = (attributes[0] as DisplayNameAttribute).DisplayName;
else
this.displayName = validationContext.DisplayName;
return base.IsValid(value, validationContext);
}
public override string FormatErrorMessage(string name)
{
return string.Format(this.ErrorMessageString, displayName);
}
}
And my model is:
[DisplayName("Full name")]
[Required]
public string Name { get; set; }
Thankfully this DataAnnotation is extensible.