Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to put DisplayName on ErrorMessage format

I have something like this:

    [DisplayName("First Name")]     [Required(ErrorMessage="{0} is required.")]     [StringLength(50, MinimumLength = 10, ErrorMessage="{0}'s length should be between {2} and {1}.")]     public string Name { get; set; } 

I want to have the following output:

  • First Name is required.
  • First Name's length should be between 10 and 50.

It is working when using ASP.NET MVC2 Error Summary, but when I try to validate it manually, like this:

        ValidationContext context = new ValidationContext(myModel, null, null);         List<ValidationResult> results = new List<ValidationResult>();         bool valid = Validator.TryValidateObject(myModel, context, results, true); 

The results are:

  • Name is required.
  • Name's length should be between 10 and 50.

What's wrong? Thanks.

like image 732
goenning Avatar asked Aug 24 '10 15:08

goenning


2 Answers

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; } 
like image 179
Sorensen Avatar answered Sep 21 '22 13:09

Sorensen


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.

like image 39
goenning Avatar answered Sep 20 '22 13:09

goenning