2012-10-08 23 views
5

geerbt werden. Ich verwende ein Basiskontaktmodell, das von anderen benutzerdefinierten Kontaktmodellklassen geerbt wird.Verhindern, dass Validierungsattribute in Modell

Das Basiskontaktmodell verwendet Validierungsattribute, um zu kennzeichnen, dass eine Eigenschaft erforderlich ist, aber in einigen Fällen möchte ich dies überschreiben oder stoppen. Wird das möglich sein?

public class ContactModel : BaseContactModel 
{ 
    [NotRequired] 
    public override string FirstName { get; set; } 
} 

ich versucht, ein Attribut neuen ValidierungsNotRequired zu verwenden, um nur true zurück, scheint aber die Attribute werden nur gestapelt so Erforderliche & NotRequired ausgeführt werden und die Validierung fehlschlägt.

Auf der Suche nach Lösungen fand ich (was ich nicht finden konnte), dass einige unabhängigen Attribute eine ‚geerbt‘ Eigenschaft haben, aber ich dies nicht in der nativen Validierung siehe Attribute in System.ComponentModel.DataAnnotations.

Ist das ein verlorener Grund? Muss ich meine eigenen Versionen rollen, die die Deaktivierung der Vererbung unterstützen? Jede Hilfe sehr geschätzt.

Antwort

2

Sehen Sie diese unten wollen, ich habe eine Klasse erstellt Model, die von einem anderen BaseModel erbt, validiert das neue Schlüsselwort verwendet dann ein jeder Instanz . Soweit ich sehen kann, benutzen sie beide die Basisattribute.

Ich habe eine Kontrollklasse ControlModel für die Klarheit der Validierungsroutine hinzugefügt.

class Program 
{ 
    static void Main(string[] args) 
    { 
     ValidationTest<Model>(); 
     ValidationTest<BaseModel>(); 
     ValidationTest<ControlModel>(); 

     Console.Read(); 
    } 

    private static void WriteAttributeInfo<T>() 
    { 
     Console.WriteLine(string.Concat(typeof(T), " attributes:")); 
     typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList(); 
    } 

    private static void ValidationTest<T>() 
    { 
     object obj = Activator.CreateInstance<T>(); 
     Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>()))); 
    } 
} 

class ControlModel 
{ 
    public string FirstName { get; set; } 

    public string Email { get; set; } 
} 

class BaseModel 
{ 
    [RequiredAttribute] 
    public virtual string FirstName { get; set; } 

    [RequiredAttribute] 
    public virtual string Email { get; set; } 
} 

class Model : BaseModel 
{ 
    public new string FirstName { get; set; } 

    public new string Email { get; set; } 
} 

ConsoleApplication1.Model Test: isValid = False

ConsoleApplication1.BaseModel Test: isValid = False

ConsoleApplication1.ControlModel Test: isValid = True

Aus In diesem Beispiel scheint es, dass Sie die ererbte erforderliche Validierung nicht überschreiben/ausblenden/ignorieren können n (habe noch nicht andere ausprobiert) Attribute.

+0

Ich hasse es zu antworten und meine eigenen Fragen zu akzeptieren, aber aus dem obigen Test scheint es, was die ursprüngliche Frage verlangt, kann nicht sein –

+0

Ist das wirklich keine Lösung? – Giorgio

0

Dies kann der Fall sein, wo man tatsächlich eine neue Eigenschaft

public class ContactModel : BaseContactModel 
{ 
     [NotRequired] 
     public new string FirstName { get; set; } 
} 
+1

Ersetzt das die Attribute? Ich habe versucht, neue (mit einer virtuellen Eigenschaft) zu verwenden, aber es scheint immer noch die Validierung zu treffen. –

+0

Ich habe diese Strategie ein paar Mal in der Vergangenheit verwendet. Es sollte eine brandneue Eigenschaft sein, daher sollte nur eine Validierungseigenschaft oder die andere ausgelöst werden. Natürlich hängt es davon ab, wie Sie Ihre Modellvariable deklarieren oder verwenden, um zu bestimmen, welche Eigenschaft tatsächlich verwendet wird. Wenn es nicht funktioniert, möchten Sie vielleicht etwas Controller-Code veröffentlichen, um zu sehen, ob wir herausfinden können, warum. – dumdum

+0

Vielen Dank für Ihre Antwort, ich werde heute Abend noch eine andere Anstrengung haben und möglicherweise sogar eine Seite direkt aus der Box versuchen. –

Verwandte Themen