2010-04-17 3 views
12

Ich verwende VS 2010 RTM und versuche, eine grundlegende Validierung für einen einfachen Typ mit MetadataTypeAttribute durchzuführen. Wenn ich das Validierungsattribut auf die Hauptklasse setze, funktioniert alles. Wenn ich es jedoch in die Metadatenklasse einfüge, scheint es ignoriert zu werden. Ich muss etwas Triviales vermissen, aber ich stecke jetzt schon eine Weile fest..NET 4 RTM MetadataType-Attribut bei Verwendung von Validator ignoriert

Ich habe mir den Enterprise Library-Validierungsblock als Workaround angesehen, aber die Validierung einzelner Eigenschaften nicht unterstützt. 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; } 
} 

Antwort

23

Es scheint, dass der Validator MetadataTypeAttribute nicht respektiert:

Diese Hilfsklasse alle Metadaten Beziehungen werden registrieren
TypeDescriptor.AddProviderTransparent(
     new AssociatedMetadataTypeTypeDescriptionProvider(
      typeof(Stuff), 
      typeof(StuffMetadata)), 
     typeof(Stuff)); 

:

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

Die Beziehung muss explicity registriert werden in einer Baugruppe:

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

Danke für diesen ausgezeichneten Klappentext !! – aikeru

+0

Warum wird dies nicht in der MetadataTypeAttribute-Auflistung auf MSDN angegeben? Ich habe ein paar Stunden b/c in meinem MVC-Projekt aufgehängt, alles funktioniert gut, aber beim Erstellen meiner Windows-App muss ich explicate sein –

2

Die Bereitstellung einer Instanz der Metadatenklasse anstelle der Hauptklasse für den ValidationContext-Konstruktor scheint für mich zu funktionieren.

+0

Das funktionierte für mich auf 'TryValidateProperty', aber nicht' TryValidateObject' leider. –

+0

@Andy Ich brauchte nur ValidateProperty, also benutzte ich diesen Hack anstelle der vollständigen Lösung aus der akzeptierten Antwort wegen des kürzeren Codes. – SlimShaggy

+0

Ich bekomme eine 'ArgumentException', die besagt, dass die bereitgestellte Instanz mit der ObjectInstance auf dem mitgelieferten validationcontext übereinstimmt. –