2014-02-07 12 views
12
Hinzufügen

sagen, dass ich die folgende Klasse haben:Daten Anmerkungen zu vererbten Klasse

public class ContactUsFormModel : AddressModel 
{ 
    [DisplayName("Title")] 
    [StringLength(5)] 
    public string Title { get; set; } 
    [DisplayName("First name (required)")] 

    [Required(ErrorMessage = "Please enter your first name")] 
    [StringLength(50, ErrorMessage = "Please limit your first name to {1} characters.")] 
    public string FirstName { get; set; } 

    // etc... 
} 

Kann ich ein erforderliches Attribut auf eine Eigenschaft von der AddressModel Klasse in der ContactUsFormModel Klasse hinzufügen?

+0

Ja ... Ich benutze dies in MVC die ganze Zeit, was ist das Problem? Wie verarbeitet man das Attribut? – Coops

+0

Ich habe das Adressmodell, das auf den meisten Formularen nicht benötigt wird, aber auf einem Formular, wo wir Broschüren verschicken, ist es erforderlich, also muss ich eine '[Required (ErrorMessage = "Bitte geben Sie Ihre Postleitzahl ein])' 'zur Basisklasse hinzufügen aber nur für dieses eine Formular - ich möchte nicht ein neues Adressmodell nur dafür machen müssen, da es seine eigenen Partial verwendet, um ein Ajax AutoFilling zu machen – Pete

+0

"... also muss ich ein [Required (ErrorMessage = "Bitte geben Sie Ihre Postleitzahl ein")] an die Basisklasse, aber nur für dieses eine Formular ... "Basisklasse ist für 'überall'. Funktioniert Ihr vorgeschlagener Ansatz nicht? – Coops

Antwort

0

Ok ich eine Abhilfe dazu gefunden haben, durch eine neue Eigenschaft der Klasse hinzufügen:

public bool AddressIsRequired { get; set; } 

Ich konnte dies gesetzt, wenn für verschiedene Formen mein Modell zu bauen und dann stattdessen das normale erforderliche Attribut zu verwenden, ich meine eigene benutzerdefinierte Validator gemacht:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)] 
public sealed class AddressRequiredAttribute : RequiredAttribute, IClientValidatable 
{ 
    public AddressRequiredAttribute() 
     : base() 
    { 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext context) 
    { 
     Type addresType = typeof(AddressModel); 
     if (context.ObjectType == addresType || context.ObjectType.BaseType == addresType) 
     { 
      AddressModel baseModel = (AddressModel)context.ObjectInstance; 
      if (baseModel != null && baseModel.AddressIsRequired) 
      { 
       return base.IsValid(value, context); 
      } 
     } 

     return ValidationResult.Success; 
    } 
} 

Und dann in meiner AddressModel konnte ich meine Eigenschaften als solche markieren:

[AddressRequired(ErrorMessage = "Please enter your Postcode")] 
public string Postcode { get; set; } 

Ich werde dies offen lassen, wenn jemand in der Lage ist, eine bessere Möglichkeit zu finden, dies zu tun (dh in der Lage, einfach die Daten-Annotation zu ändern, ohne ein separates Attribut zu machen). Diese Vorgehensweise bedeutet auch, dass die Eigenschaften, die mit diesem Attribut markiert sind, immer dann als erforderlich markiert werden, wenn Sie das Label für den Helper erweitern und die Metadaten zum Überprüfen des IsRequired-Flags verwenden (ich denke, dies könnte daran liegen, dass es vom erforderlichen Attribut erbt).

4

Versuchen Sie, MetadatatypeAttribute zu verwenden. Erstellen Sie separate Klassen für Metadaten, in denen Sie Ihren Eigenschaften direkt Attribute hinzufügen.

[MetadataType(typeof(MyModelMetadata))] 
public class ContactUsFormModel : AddressModel 
{ 
    [DisplayName("Title")] 
    [StringLength(5)] 
    public string Title { get; set; } 
    [DisplayName("First name (required)")] 

    [Required(ErrorMessage = "Please enter your first name")] 
    [StringLength(50, ErrorMessage = "Please limit your first name to {1} characters.")] 
    public string FirstName { get; set; } 

    // etc... 
} 

internal class MyModelMetadata { 
    [Required] 
    public string SomeProperyOfModel { get; set; } 
} 

[Bearbeiten] Above Methode ist für Sie nicht sinnvoll, wie Sie gesagt haben, es wird nicht Attribute Basisklasse hinzufügen.

Also machen Sie die Eigenschaften in AddressModel virtual und override sie in ContactUsFormModel und auf diese Weise können Sie Attribut hinzufügen.

+2

Leider funktioniert das nicht, da es die Eigenschaften des AddressModels nicht überschreibt – Pete

+0

Gerade gesehen Ihre Bearbeitung - es funktioniert nur halb, das benötigte funktioniert jetzt wo ich es will aber es ändert den Anzeigenamen nicht, kann das nicht überschrieben werden? – Pete

+0

Es nimmt auch nicht die Ajax-Validierung aus irgendeinem Grund – Pete

Verwandte Themen