72 votes

Comment ajouter des attributs aux propriétés d'une classe de base ?

J'ai quelques classes modèles comme ça :

public class MyModelBase
{
    public string Name { get; set; }
}

public class MyModel : MyModelBase
{
    public string SomeOtherProperty { get; set; }
}

Comment MyModel peut-il ajouter un attribut [Required] à la propriété Name ?

56voto

Justin Niessner Points 144953

Déclarez la propriété dans la classe parente comme virtuelle :

public class MyModelBase
{
    public virtual string Name { get; set; }
}

public class MyModel : MyModelBase
{
    [Required]
    public override string Name { get; set; }

    public string SomeOtherProperty { get; set; }
}

Vous pouvez aussi utiliser un MetadataType pour gérer la validation (tant que vous parlez de DataAnnotations... sinon vous êtes coincé avec l'exemple ci-dessus) :

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

    public string SomeOtherProperty { get; set; }
}

[MetadataType(typeof(MyModelMetadata))]
public class MyModel : MyModelBase
{
    public string SomeOtherProperty { get; set; }
}

46voto

Kevin McKelvin Points 1790

Essayez d'utiliser un classe de métadonnées . Il s'agit d'une classe distincte qui est référencée à l'aide d'attributs qui vous permettent d'ajouter indirectement des annotations de données aux classes de modèle.

par exemple

[MetadataType(typeof(MyModelMetadata))]
public class MyModel : MyModelBase {
  ... /* the current model code */
}

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

ASP.NET MVC (y compris Core) offre un support similaire pour ses attributs tels que FromQuery par l'intermédiaire du ModelMetadataTypeAttribute .

31voto

Justin Minnaar Points 321

Je note qu'aucune de ces réponses n'appelle correctement la propriété Name de la base. La surcharge devrait écrire quelque chose comme ce qui suit, afin que vous n'ayez pas une valeur séparée pour la nouvelle propriété.

public class MyModelBase
{
    public virtual string Name { get; set; }
}

public class MyModel : MyModelBase
{
    [Required]
    public override string Name { get { return base.Name; } set { base.Name = value; }

    public string SomeOtherProperty { get; set; }
}

0voto

ahmet Points 484

Vous pouvez surcharger la propriété de base par le mot clé "new".

public class MyModelBase
{
     public string Name { get; set; }
}

public class MyModel : MyModelBase
{
     [Required]
     public new string Name {get; set;}
     public string SomeOtherProperty { get; set; }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X