2010-08-24 16 views
18

ho qualcosa di simile a questo:come mettere DisplayName sul formato ErrorMessage

[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; } 

voglio avere il seguente output:

  • Nome è richiesto. lunghezza
  • Prima del nome dovrebbe essere tra 10 e 50.

Si sta lavorando quando si utilizza ASP.NET MVC2 Riepilogo degli errori, ma quando provo a validare manualmente, in questo modo:

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

I risultati sono i seguenti: è necessario

  • Nome. lunghezza
  • del nome dovrebbe essere tra 10 e 50.

Cosa c'è che non va? Grazie.

+0

che sembrano avere lo stesso problema come OP. Nella parte principale, l'utilizzo di [DisplayName] o [Display] sulla proprietà funziona correttamente (sostituire {0} nel messaggio di errore dell'attributo richiesto con il nome visualizzato), tuttavia ho scoperto che gli errori del modello emessi dalla convalida lato server possono essere errato (sostituire {0} con il nome della proprietà) - anche se la validazione non invadente fornisce il valore corretto per la stessa proprietà. (Per vedere questo ho dovuto disattivare javascript). Non sono ancora stato in grado di arrivare alla fine di questo - osservato con MVC 5.2.3 –

risposta

9

Beh, penso di averlo fatto.

ho dovuto creare un altro attributo come questo:

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); 
    } 
} 

E il mio modello è:

[DisplayName("Full name")] 
    [Required] 
    public string Name { get; set; } 

fortuna questo DataAnnotation è estensibile.

+1

Ciò modifica il comportamento di come vengono visualizzati i tag richiesti. Cercherò di dare seguito a una soluzione che non influisce sul modo in cui il framework delle entità esegue la convalida sul lato client quando ho più tempo per verificare che soddisfi la necessità iniziale di questa domanda. –

28

Anziché (o forse in combinazione con) l'attributo [DisplayName], utilizzare l'attributo [Display] in System.ComponentModel.DataAnnotations. Popolare la sua proprietà Name.

Con ciò, è possibile utilizzare gli attributi di convalida incorporati o gli attributi personalizzati con ValidationContext di DisplayName.

esempio,

[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; } 
+0

Eccellente ... mi hai salvato la giornata. Dove hai preso questa informazione per favore? – developer

+1

Mi dispiace, non ho ricordi. [Source amnesia] (https://en.wikipedia.org/wiki/Source_amnesia) colpisce ancora. Posso tuttavia dire con grande sicurezza che non l'ho letto dalla documentazione MSDN. – Sorensen

Problemi correlati