Erweiterung von ASP.NET-Validatoren

9

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 validieren müssen. Normalerweise würde ich nur eine Kombination aus einem RequiredFieldValidator verwenden (um sicherzustellen, dass das Datum angegeben wird), CompareValidator (um sicherzustellen, dass das Datum ein Datum ist) und schließlich einem RangeValidator (um sicherzustellen, dass das Datum innerhalb des erforderlichen Limits liegt).

Das Problem dabei ist, dass die Validatoren nicht voneinander abhängig sind. Als Ergebnis würde der Benutzer möglicherweise alle drei Nachrichten gleichzeitig für jeden Validierer sehen, wenn wirklich alles, was wir sehen wollen, die relevanteste Nachricht ist, d wenn sie "abc" in das Datumstextfeld eingeben, wäre es nicht angebracht, ihnen die Nachricht zu zeigen, dass das Datum nicht im gültigen Bereich liegt (obwohl ich technisch wahrscheinlich davon ausgehe).

Gegenwärtig verwenden wir einen CustomValidator, um diese Art von Funktionalität bereitzustellen, und legen einfach alle drei Validierungen innerhalb des validate-Ereignishandlers des Servers fest und ändern die Fehlermeldung programmgesteuert, je nachdem, welche Validierung fehlgeschlagen ist.

Ich würde das gerne etwas mehr standardisieren, da es in dieser Anwendung ziemlich oft vorkommt. Ich denke, wenn ich die Validatoren voneinander abhängig machen kann, wird das das Problem lösen und es uns auch ermöglichen, die Client-Seite zu nutzen Validierung statt Postback speziell für die benutzerdefinierte Validierung.

Die Idee ist, dass, wenn ein Validator von einem anderen abhängig ist, der "Master" gültig ist, der Abgelehnte seine normale Validierung durchführt (EvaluateIsValid ()). Andernfalls, wenn der Master Validator nicht gültig ist, sind die anderen abhängigen Validatoren gültig .

Ich habe die folgende Lösung gefunden, indem ich von den verschiedenen Validator-Steuerelementen geerbt habe, die bereits im Framework bereitgestellt wurden.

%Vor%

Ich habe es gerade für den RequiredFieldValidator programmiert, idealerweise möchte ich diese Funktionalität für alle Validatoren bereitstellen, aber ich sehe keinen Weg, dies zu tun, ohne den obigen Code in eine ähnliche Klasse für jeden einzelnen Typ von Validator zu kopieren Ich möchte diese Funktionalität für so bereitstellen, wenn ich irgendwelche Probleme habe, werde ich zurückgehen und diesen Code für jeden Validator-Typ einzeln ändern.

Gibt es eine Möglichkeit, dass ich diesen Code "zentralisieren" und leicht in den Validatoren verwenden kann, ohne die gesamten Validatoren von Grund auf neu schreiben zu müssen, nur um die Klasse, die sie erben, von weiter unten zu ändern.

Prost,

    
Daniel Powell 01.08.2010, 06:53
quelle

4 Antworten

0

Vielleicht möchten Sie in einen WebControlAdapter schauen.

Grundsätzlich können Sie bestimmte Methoden von Webcontrols (bedingt für einige Browser bei Bedarf, aber hier für alle) überschreiben.

In Ihrem Fall sollten Sie die EvaluateIsValid-Methode überschreiben und überprüfen, ob das Steuerelement von einem 'übergeordneten' Validator abhängig ist.

Als Beispiel einen TextBox-Adapter, den wir kürzlich erstellt haben, um ein 'maxlength'-Attribut für das Steuerelement zu rendern.

%Vor%

Um es zu verwenden, erstellen Sie einfach eine .browser-Datei in Ihrem App_Browsers-Verzeichnis und richten Sie den Adapter dort ein:

%Vor%

Die einzige Komplikation, die in Ihrem Fall weiterhin besteht, ist, wie der abhängige Validator gespeichert wird, damit der EvaluateIsValid Zugriff auf dieses Verzeichnis hat. Sie können ein nicht gerendertes Steuerelement wie Onof vorgeschlagen oder Viewstate / Cookie / anderen Speichermechanismus betrachten.

    
Sam 03.08.2010, 08:06
quelle
1

Sie könnten die Validate-Methode in Ihrer Seitenbasis überschreiben. Um die Validierungsabhängigkeitsinformationen auf der Seite hinzuzufügen, können Sie ein nicht gerendertes Steuerelement implementieren:

%Vor%     
onof 01.08.2010 07:07
quelle
0

Sie können die Eigenschaft ValidationControlToDependOn vom Typ List haben und die Validatoren in die Liste einfügen. Daher können wir davon ausgehen, dass der später hinzugefügte Validator von dem zuvor hinzugefügten Validator abhängt.

also dein protected override bool EvaluateIsValid()

wird sich etwas ändern

%Vor%     
ajay_whiz 01.08.2010 07:16
quelle
0

Ich schaue in Kontroll-Extender, die scheinen, als könnte es vielversprechend sein, aber ich kann nicht viele Beispiele dafür finden, irgendetwas anderes als AJAX-Sachen damit zu machen.

    
Daniel Powell 01.08.2010 08:48
quelle

Tags und Links