2010-05-11 2 views
15

Gegeben die folgenden Klassen:Fehlermeldungen zur Modellvalidierung unter Verwendung von Daten Anmerkungen

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

Gibt es eine saubere Art und Weise ich eine eindeutige Fehlermeldung für jede Instanz von Contact in BookDataAnnotations Verwendung geben kann? Wenn der Name beispielsweise in der PrimaryContact-Instanz fehlt, lautet der Fehler "Name des primären Kontakts ist erforderlich".

Meine aktuelle Lösung besteht darin, einen Validierungsdienst zu erstellen, der den Modellstatus auf Feldfehler überprüft, diese Fehler dann entfernt und sie in der gewünschten Sprache wieder hinzufügt.

Antwort

28

Das ist der einzige Weg, den ich davon weiß, aber es ist alles andere als sauber. Es beinhaltet die Verwendung von Subklassen- und MetaData-Klassen, um die Fehlermeldung zu "überschreiben".

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

Ich suche nach Antwort auf diese Frage zu, was ich bisher gefunden habe, wenn Sie so etwas tun: „{0} Name der Kontaktperson erforderlich ist,“ in der Fehlermeldung wird es den Namen der automatisch ersetzen Variable. Ich denke, es gibt eine Möglichkeit, diese Funktion explizit zu verwenden.

9

Ich verstehe, dass dies alt ist, aber im Interesse, anderen zu helfen, die auf dieses Problem stoßen und stolpern über diese Frage, wie ich es getan habe, möchten Sie vielleicht mit dem CustomValidation Attribut für solche Eigenschaften statt auf die Required Attribut.

CustomValidation können Sie Ihre Validierungsnachrichten genauer auf die Eigenschaft zuschneiden, die Sie validieren. Ich habe context.DisplayName verwendet, um den Namen der Eigenschaft, die gerade überprüft wird, dynamisch anzuzeigen, aber dies kann basierend auf Ihren Anforderungen weiter angepasst werden.

Wenn noch weitere Anpassungen erforderlich sind, können Sie für jede einzelne Eigenschaft unterschiedliche CustomValidation-Handler schreiben, statt sie einfach wie in meinem Codebeispiel wiederverwenden zu müssen.

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