Frage

Ich bin mit VS 2010 RTM und versuchen, einige grundlegende Überprüfung auf einfache Art auszuführen MetadataTypeAttribute verwenden. Wenn ich auf der Hauptklasse die Validierung Attribut setzen, funktioniert alles. Allerdings, wenn ich es auf der Metadatenklasse setzen, so scheint es, um ignoriert zu werden. Ich muss etwas trivial fehlt, aber ich habe für eine Weile auf diese aufgeklebt.

hatte ich einen Blick auf die Enterprise Library Validierungsblock als Behelfslösung, aber es bietet keine Unterstützung für die Validierung einzelner Objekte aus der Box. Irgendwelche Ideen?

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; }
}
War es hilfreich?

Lösung

Es scheint, dass der Validator MetadataTypeAttribute nicht respektiert:

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

Die Beziehung muss explicity registriert werden:

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

Diese Hilfsklasse wird alle Metadaten Beziehungen in einer Baugruppe registrieren:

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

Andere Tipps

eine Instanz der Metadatenklasse Versorgung anstelle der Hauptklasse an den ValidationContext Konstruktor scheint für mich arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top