Messaggi di errore per la convalida del modello mediante annotazioni di dati

Date le seguenti classi:

using System.ComponentModel.DataAnnotations; public class Book{ public Contact PrimaryContact{get; set;} public Contact SecondaryContact{get; set;} [Required(ErrorMessage="Book name is required")] public string Name{get; set;} } public class Contact{ [Required(ErrorMessage="Name is required")] public string Name{get; set;} } 

C’è un modo pulito posso dare un messaggio di errore distinto per ogni istanza di Contact in Book usando DataAnnotations ? Ad esempio, se il nome mancava PrimaryContact l’errore avrebbe letto “è richiesto il nome del contatto principale”.

La mia soluzione attuale è quella di creare un servizio di validazione che controlli lo stato del modello per gli errori di campo, quindi rimuovi gli errori e aggiungili di nuovo utilizzando la lingua specifica che desidero.

Questo è l’unico modo che conosco, ma è tutt’altro che pulito. Implica l’uso di classi di sottoclassi e di metadati per “sovrascrivere” il messaggio di errore.

 public class Book { public PrimaryContact PrimaryContact { get; set; } public SecondaryContact SecondaryContact { get; set; } [Required(ErrorMessage = "Book name is required")] public string Name { get; set; } } public class Contact { [Required(ErrorMessage = "Name is required")] public string Name { get; set; } } [MetadataType(typeof(PrimaryContactMD))] public class PrimaryContact : Contact { class PrimaryContactMD { [Required(ErrorMessage = "Primary Contact Name is required")] public string Name { get; set; } } } [MetadataType(typeof(SecondaryContactMD))] public class SecondaryContact : Contact { class SecondaryContactMD { [Required(ErrorMessage = "Secondary Contact Name is required")] public string Name { get; set; } } } 

Capisco che questo è vecchio, ma nell’interesse di aiutare gli altri che si imbattono in questo problema e inciampare su questa domanda come ho fatto, si potrebbe voler usare l’attributo CustomValidation per tali proprietà invece di fare affidamento sull’attributo Required .

CustomValidation ti consentirà di personalizzare in modo granulare i tuoi messaggi di convalida sulla proprietà che stai convalidando. Ho usato context.DisplayName per visualizzare dynamicmente il nome della proprietà da validare solo per brevità, ma questo può essere personalizzato ulteriormente in base alle tue esigenze.

Se è necessaria un’ulteriore personalizzazione, è ansible scrivere diversi gestori CustomValidation per ogni singola proprietà invece di riutilizzare la stessa come ho fatto nel mio esempio di codice.

 using System.ComponentModel.DataAnnotations; public class Book { [CustomValidation(typeof(Book), "ValidateContact")] public Contact PrimaryContact { get; set; } [CustomValidation(typeof(Book), "ValidateContact")] public Contact SecondaryContact { get; set; } [Required(ErrorMessage = "Book name is required")] public string Name { get; set; } public static ValidationResult ValidateContact(Contact contact, ValidationContext context) { ValidationResult result = null; if (contact == null) { result = new ValidationResult(string.Format("{0} is required.", context.DisplayName)); } else if (string.IsNullOrWhiteSpace(contact.Name)) { result = new ValidationResult(string.Format("{0} name is required.", context.DisplayName)); } return result; } } public class Contact { [Required(ErrorMessage = "Name is required")] public string Name { get; set; } } 

Sto cercando una risposta anche a questo, quello che ho trovato finora se fai qualcosa del tipo: “{0} Contact Name is required” nel messaggio Error sostituirà automaticamente il nome della variabile. Immagino ci sia un modo per usare esplicitamente questa funzione.