Question

J'utilise VS 2010 RTM et d'essayer d'effectuer une validation de base sur un type simple en utilisant MetadataTypeAttribute. Quand je mets l'attribut de validation de la classe principale, tout fonctionne. Cependant, quand je l'ai mis sur la classe des métadonnées, il semble être ignoré. Je dois manquer quelque chose de trivial, mais je suis coincé là-dessus depuis un certain temps maintenant.

J'ai eu un regard sur le bloc de validation Enterprise Library comme une solution de contournement, mais il ne supporte pas la validation des propriétés individuelles de la boîte. Toutes les idées?

class Program
{
    static void Main(string[] args)
    {
        Stuff t = new Stuff();

        try
        {
            Validator.ValidateProperty(t.X, new ValidationContext(t, null, null) { MemberName = "X" });
            Console.WriteLine("Failed!");
        }
        catch (ValidationException)
        {
            Console.WriteLine("Succeeded!");
        }
    }
}

[MetadataType(typeof(StuffMetadata))]
public class Stuff
{
    //[Required]  //works here
    public string X { get; set; }
}

public class StuffMetadata
{
    [Required]  //no effect here
    public string X { get; set; }
}
Était-ce utile?

La solution

Il semble que le validateur ne respecte pas MetadataTypeAttribute:

http://forums.silverlight.net/forums/p/149264 /377212.aspx

La relation doit être enregistrée explicity:

 TypeDescriptor.AddProviderTransparent(
      new AssociatedMetadataTypeTypeDescriptionProvider(
          typeof(Stuff),
          typeof(StuffMetadata)), 
      typeof(Stuff)); 

Cette classe d'aide enregistrera toutes les relations de métadonnées dans un assemblage:

public static class MetadataTypesRegister
{
    static bool installed = false;
    static object installedLock = new object();

    public static void InstallForThisAssembly()
    {
        if (installed)
        {
            return;
        }

        lock (installedLock)
        {
            if (installed)
            {
                return;
            }

            foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
            {
                foreach (MetadataTypeAttribute attrib in type.GetCustomAttributes(typeof(MetadataTypeAttribute), true))
                {
                    TypeDescriptor.AddProviderTransparent(
                        new AssociatedMetadataTypeTypeDescriptionProvider(type, attrib.MetadataClassType), type);
                }
            }

            installed = true;
        }
    }
}

Autres conseils

Fournir une instance de la classe de métadonnées au lieu de la classe principale au constructeur ValidationContext semble fonctionner pour moi.

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