Pregunta

Estoy utilizando VS 2010 RTM y tratar de realizar una validación básica en un tipo simple usando MetadataTypeAttribute. Cuando pongo el atributo de validación en la clase principal, todo funciona. Sin embargo, cuando lo puse en la clase de metadatos, que parece ser ignorado. Debo estar perdiendo algo trivial, pero he estado pegado en esto durante un tiempo.

Yo tenía un aspecto en el bloque de validación Enterprise Library como una solución, pero no admite la validación de las propiedades individuales de la caja. Algunas ideas?

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; }
}
¿Fue útil?

Solución

Parece que el validador no respeta MetadataTypeAttribute:

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

La relación debe ser explícitamente registrado:

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

Esta clase de ayuda registrará todas las relaciones de metadatos en una asamblea:

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

Otros consejos

El suministro de una instancia de la clase de metadatos en lugar de la clase principal al constructor ValidationContext parece funcionar para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top