Utilisation de la DefaultValueAttribute sur une classe qui est utilisé comme type dans un MetadataTypeAttribute

StackOverflow https://stackoverflow.com/questions/4741909

  •  12-10-2019
  •  | 
  •  

Question

J'utilise l'attribut MetadataType pour ajouter des attributs de validation des classes je générer en utilisant un modèle T4. Cela fonctionne à merveille, mais je voudrais être en mesure d'utiliser l'attribut DefaultValue sur certaines propriétés, de sorte que ma classe MetadataType décrira plus complètement mes classes (et que je ne vais pas avoir à mettre en œuvre la méthode OnCreated dans ces classes) . Je peux ajouter l'attribut à ma classe de MetadataType, mais il n'a pas d'effet.

Voici une source d'exemple - la partie générée est (bien sûr) dans un fichier différent. Si j'instancier un objet Widget, la propriété Name sera nulle.

/// <summary>
/// This part is generated
/// </summary>
public partial class Widget
{
    public string Name { get; set; }
}

/// <summary>
/// This part is hand-coded so I can add attributes, custom methods etc.
/// </summary>
[System.ComponentModel.DataAnnotations.MetadataType(typeof(WidgetMetadata))]
public partial class Widget
{
}

/// <summary>
/// This part is hand-coded, and any validation attributes I add work fine.
/// </summary>
public class WidgetMetadata
{
        [System.ComponentModel.DefaultValue("Default Name")]
        [StringLengthValidator(0, RangeBoundaryType.Inclusive, 320, RangeBoundaryType.Inclusive, Tag = "Invalid string length", MessageTemplate = "{1} must contain between \'{3}\' to \'{5}\' characters.")]
        public string Name { get; set; }
}

Qu'est-ce que je fais mal ?, ou est-ce pas pris en charge (et si oui est-il documenté nulle part?)

Était-ce utile?

La solution

Ajouter un constructeur à la classe WidgetMetaData et définissez la valeur par défaut de la propriété là-bas. Le DefaultValueAttribute est utilisé pour la boîte à outils Visual Studio (je crois) pour déterminer si la valeur doit être en gras (modifiée) ou non (valeur par défaut), entre autres. Vous devez toujours définir la valeur de la propriété à un moment donné.

public WidgetMetaData() 
{
    Name = "Default Value";
}

Plus d'informations sur le DefaultValueAttribute: http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute (v = vs.71) .aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top