2016-05-12 11 views
-1

Ich verwende C# 4.5 Web-API-Projekt.Wert zum Attribut basierend auf dem empfangenen Wert übergeben

Wenn ich HttpPost-Anfragen von Clients empfange, möchte ich die Anfragefelder validieren. Das Problem besteht darin, dass die Eingabevalidierung abhängig von der Eingabe selbst ist, oder, genauer gesagt, von der bereitgestellten Enumeration abhängig ist.

Unter der Annahme, ich die folgende Klasse:

public class A 
{ 
    public myEnum Filter{set;get;} 

    [myEnumCheckName(Filter)] 
    public string Name {set;get;} 

    [myEnumCheckEmail(Filter)] 
    public string Email {set;get;} 
} 

public enum myEnum {ByName = 1, ByEmail = 2} 

Und auch schrieb ich 2 validatorAttributes:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] 
public class myEnumCheckName : ValidationAttribute 
{ 
    private readonly someNameValidator _validator = new someNameValidator(); 
    private readonly myEnum _filter; 

    public myEnumCheckName(myEnum filter) 
    { 
     _filter = filter; 
    } 

    public override bool IsValid(object value) 
    { 
     if (_filter == myEnum.ByName) 
      return _validator.IsValid(value); 

     return true; 
    } 
} 

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] 
public class myEnumCheckEmail : ValidationAttribute 
{ 
    private readonly someEmailValidator _validator = new someEmailValidator(); 
    private readonly myEnum _filter; 

    public myEnumCheckEmail(myEnum filter) 
    { 
     _filter = filter; 
    } 

    public override bool IsValid(object value) 
    { 
     if (_filter == myEnum.ByEmail) 
      return _validator.IsValid(value); 

     return true; 
    } 
} 

Problem ist, dass wenn ich [myEnumCheckName(myEnum) versuchen nennen es sagt:

Can not Auf statische Eigenschaft myEnum im statischen Kontext zugreifen.

Gibt es trotzdem Zugriff auf die Instanz/aktuellen Kontextfeldwerte?

Danke.

KLARSTELLUNG

ich die Name und Email Eigenschaften überprüfen möchten, das ist die allgemeine Idee. Nun, ich habe nichts dagegen, wenn Name wäre Null, wenn der Filter Wert wird ByEmail und umgekehrt. Auf diese Weise muss ich nicht die gleiche Methode schreiben, die die Anfrage zweimal behandelt.

+0

Bitte lesen Sie [ask] und stellen Sie eine [mcve] bereit Ihr erster Codeblock ist voll von Syntaxfehlern. Untersuchen Sie auch den _actual_ Fehler, den Sie erhalten. Das Problem besteht darin, dass Sie einen Mitgliedsnamen haben, der dem Aufzählungsnamen entspricht. Verwenden Sie den vollständigen Namespace der Enumeration im Attribut. – CodeCaster

+0

Es ist nicht klar, was Sie erreichen möchten. Möchten Sie überprüfen, ob das Feld 'Name' nicht leer ist, sondern nur, wenn der angegebene Aufzählungswert gleich 'ByName' ist? Bitte klären Sie. Außerdem fehlt Ihren Attributdeklarationen eine abschließende eckige Klammer, sodass CodeCaster richtig ist. –

+0

@FedericoDipuma Sie verstanden es gut. und CodeCaster ist richtig, wenn ich 2 Klammern verpasst habe, aber es ist kein Grund, eine Frage zu verwerfen und zu behaupten, dass nur aufgrund dieser 2 Klammern meine gesamte Frage nicht gut geschrieben ist.Auch eine zusätzliche Klärung in Frage –

Antwort

1

Sie können diese Art von Validierungslogik nicht mithilfe des integrierten Validierungsframeworks von ComponentModel.DataAnnotations erreichen. Wenn Sie Ihre Klasseneigenschaften basierend auf anderen Eigenschaftenwerten automatisch validieren möchten, sollten Sie zu einem anderen Validierungsframework mit einer solchen Funktion wechseln.

Ich empfehle Ihnen, in FluentValidation zu schauen, und erstellen Sie benutzerdefinierte Validatoren für Ihre Klassen, die komplexe Situationen wie die beschriebene leicht behandeln können. Sie könnten zum Beispiel einen Validator für Ihre A Klasse ähnlich wie derjenige folgende erstellen:

public class AValidator: AbstractValidator<A> 
{ 
    public AValidator() 
    { 
     RuleFor(a => a.Name) 
      .NotEmpty() 
      .When(c => c.Filter == myEnum.ByName); 

     RuleFor(a => a.Email) 
      .NotEmpty() 
      .When(c => c.Filter == myEnum.ByEmail); 
    } 
} 

Um mehr zu erfahren, wie FluentValidation in Web Api integrieren Sie auf die folgende Anleitung beziehen (Sie die Ninject ignorieren Teil, wenn Sie keine Validatoren über ein Abhängigkeitsinjektions-Framework bereitstellen möchten):

Verwandte Themen