2011-01-06 4 views
2

Ich habe eine Entity Framework generierte Klasse mit den folgenden Eigenschaften:Datenvalidierung mit benutzerdefinierten Attributen (AttributeTargets.Class) auf EF Buddy-Klassen

public DateTime LaunchDate; 
public DateTime ExpirationDate; 

ich, dass ExpirationDate> LaunchDate erzwingen muß.

Ich verwende eine Buddy-Klasse wie in verschiedenen Posts beschrieben. Ich verwende benutzerdefinierte Validierungsattribute (auf Eigenschaften) auf andere Eigenschaften in derselben Buddy-Klasse und diese funktionieren.

Da ich zwei Eigenschaften vergleichen muss ich ein Attribut direkt auf die Klasse bin mit (AttributeTargets.Class)

Hier ist meine benutzerdefinierte Validierung Attribut:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public class PropertyMustBeGreaterThanAttribute : ValidationAttribute 
{ 
    private const string _defaultErrorMessage = "'{0}' must be greater than '{1}'!"; 

    public PropertyMustBeGreaterThanAttribute(string property, string greaterThan) 
     : base(_defaultErrorMessage) 
    { 
     GreaterThan = greaterThan; 
     Property = property; 
    } 

    public string Property { get; private set; } 
    public string GreaterThan { get; private set; } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      GreaterThan, Property); 
    } 

    public override bool IsValid(object value) 
    { 
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 
     IComparable greaterThan = properties.Find(GreaterThan, true /* ignoreCase */).GetValue(value) as IComparable; 
     IComparable property = properties.Find(Property, true /* ignoreCase */).GetValue(value) as IComparable; 
     return greaterThan.CompareTo(property) > 0; 
    } 
} 

Zuerst bin ich zu welcher Klasse unsicher Ich muss das Attribut anwenden:

Zweitens, es funktioniert nicht und ich habe keine Ahnung, warum! Ich habe versucht, Attribut zu beiden Klassen hinzuzufügen. Haltepunkte im Konstruktor werden getroffen (PropertyMustBeGreaterThanAttribute), aber IsValid wird nie aufgerufen.

Ziehen meine Haare schon raus ....

Vielen Dank!

Antwort

5

Hat es funktioniert, indem TypeID implementiert. ich das Attribut der Teilklasse zugeordnet:

[MetadataType(typeof(PromotionValidation))] 
    [PropertyMustBeGreaterThanAttribute("RetailPrice", "DiscountedPrice")] 
    [PropertyMustBeGreaterThanAttribute("ExpirationDate", "LaunchDate")] 
    [PropertyMustBeGreaterThanAttribute("ClaimDeadline", "ExpirationDate")] 
    public partial class Promotion 
    { 
... 

Hier ist die Liste, falls jemand braucht es:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public class PropertyMustBeGreaterThanAttribute : ValidationAttribute 
{ 
    private const string _defaultErrorMessage = "'{1}' must be greater than '{0}'!"; 
    private readonly object _typeId = new object(); 

    public PropertyMustBeGreaterThanAttribute(string property, string greaterThan) 
     : base(_defaultErrorMessage) 
    { 
     GreaterThan = greaterThan; 
     Property = property; 
    } 

    public string Property { get; private set; } 
    public string GreaterThan { get; private set; } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, 
      GreaterThan, Property); 
    } 

    public override bool IsValid(object value) 
    { 
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 
     IComparable greaterThan = properties.Find(GreaterThan, true /* ignoreCase */).GetValue(value) as IComparable; 
     IComparable property = properties.Find(Property, true /* ignoreCase */).GetValue(value) as IComparable; 
     return greaterThan.CompareTo(property) > 0; 
    } 

    public override object TypeId 
    { 
     get 
     { 
      return _typeId; 
     } 
    } 
} 
+0

ich den Code versucht, aber wenn ich versuche, Validator.TryValidateObject zu nennen, ist es nicht Schritt in die "Bool IsValid (Objektwert)" Methode. Wie kann ich das erreichen? – Lance

+0

@ LawrenceA.Contreras es ist eine lange Zeit seit ich mit asp.net mvc gestoppt. Ich benutze node.js jetzt, aber irgendwie erinnere ich mich an dieses Problem und ich erinnere mich, dass es wie erwartet funktioniert hat. Ich habe den oben angegebenen Code überprüft und es ist abgeschlossen. Ich habe die Validierung nie direkt aufgerufen, da die Validierung als Teil des Datenvalidierungs-Frameworks durchgeführt wurde. Haben Sie sich http://stackoverflow.com/questions/4426854/how-to-call-validationattributes-manual-dataannotations-and-modelstate angesehen? – santiagoIT