Ich möchte die asp.net-Validatoren so erweitern, dass ich einen Validator von einem anderen abhängig machen kann. Die Situation, die ich habe, ist, dass wir ein Datum in einem Textfeld zu validieren haben. Normalerweise würde ich nur eine Kombination aus einem RequiredFieldValidator (um sicherzustellen, dass das Datum angegeben wird), einem CompareValidator (um sicherzustellen, dass das Datum ein Datum ist) und schließlich einem RangeValidator (um sicherzustellen, dass das Datum innerhalb der erforderlichen Grenze liegt) verwenden.
Das Problem dabei ist, dass die Prüfer nicht voneinander abhängen, so dass der Benutzer möglicherweise alle drei Meldungen für jeden Prüfer auf einmal sehen würde, obwohl wir eigentlich nur die relevanteste Meldung sehen wollen, d. h. wenn er "abc" in das Textfeld für das Datum eingegeben hat, wäre es nicht angemessen, ihm die Meldung zu zeigen, dass das Datum nicht im gültigen Bereich liegt (obwohl das technisch gesehen vermutlich stimmt).
Um diese Art von Funktionalität bereitzustellen, verwenden wir derzeit einen CustomValidator und setzen alle drei Validierungen in den Server-Validate-Event-Handler und ändern die Fehlermeldung programmatisch, je nachdem, welche Validierung fehlgeschlagen ist.
Ich möchte dies ein bisschen mehr zu standardisieren, wie es ziemlich viel in dieser Anwendung geschieht, ich denke, wenn ich die Validatoren voneinander abhängig machen kann dies das Problem lösen und auch uns erlauben, die Client-Seite Validierung zu verwenden, anstatt mit einem Postback speziell die benutzerdefinierte Validierung zu behandeln.
Die Idee ist, dass, wenn ein Prüfer von einem anderen abhängig ist und dieser "Master" gültig ist, der abhängige Prüfer seine normale Prüfung durchführt (EvaluateIsValid()), andernfalls, wenn der Master-Prüfer nicht gültig ist, werden die anderen abhängigen Prüfer gültig sein.
Ich habe die folgende Lösung gefunden, indem ich von den verschiedenen Validator-Steuerelementen geerbt habe, die bereits im Framework enthalten sind.
public class RequiredFieldDependentValidator : RequiredFieldValidator
{
[Description("The validation control to depend on for determining if validation should occur")]
public string ValidationControlToDependOn
{
get
{
object obj = ViewState["ValidationControlToDependOn"];
if (obj != null) return (string) obj;
return null;
}
set
{
Control control = FindControl(value);
if (control is IValidator)
ViewState["ValidationControlToDependOn"] = value;
else
throw new HttpException("ValidationControlToDependOn is not a validation control");
}
}
protected override bool EvaluateIsValid()
{
IValidator validationControlToDependOn = FindControl(ValidationControlToDependOn) as IValidator;
if(validationControlToDependOn != null)
{
return !validationControlToDependOn.IsValid || base.EvaluateIsValid();
}
return base.EvaluateIsValid();
}
Derzeit habe ich nur codiert es für die RequiredFieldValidator, idealerweise möchte ich diese Funktionalität für alle Validatoren bieten, aber ich kann nicht sehen, eine Möglichkeit, dies zu tun, ohne Kopieren der oben genannten Code in eine ähnliche Klasse für jeden einzelnen Typ von Validator ich diese Funktionalität für so bereitstellen möchten, wenn es irgendwelche Probleme gibt, ich werde zurück zu gehen und ändern Sie diesen Code auf jedem Validator-Typ einzeln.
Gibt es eine Möglichkeit, wie ich diesen Code "zentralisieren" und ihn leicht in den Validatoren verwenden kann, ohne die gesamten Validatoren von Grund auf neu schreiben zu müssen, nur damit ich die Klasse, von der sie erben, im weiteren Verlauf ändern kann.
Zum Wohl,