2011-01-10 12 views
0

Ich versuche, ein IsRequired Attribut auf unserem eigenen Lookup-Steuerelement zu implementieren (eigentlich ein Wrapper mit einem Ajax AutoCompleteExtender und einem CustomValidator). Wie Sie wissen, beinhaltet das Implementieren der richtigen Validierung für ein Suchsteuerelement nicht nur das Überprüfen, ob das Steuerelement nicht leer ist, sondern der Eintrag muss tatsächlich in der Suchvorhersageliste vorhanden sein.CustomValidator zum Implementieren IsRequired auf Ajax AutoCompleteExtender

Ich tue dies mit dem folgenden ClientValidationFunction zum CustomValidator verdrahtet:

function ValidateLookup(sender, args) { 
var isValidEntry = $("#" + sender.controltovalidate) 
        .parent() 
        .children() 
        .filter("input:first") 
        .attr('ValidEntry') == args.Value; 

if (isValidEntry) 
    args.IsValid = true; 
else { 
    var acEntries = $("#" + sender.controltovalidate) 
        .parent() 
        .find("li[innerText=" + args.Value + "]"); 
    args.IsValid = acEntries.length > 0; 
    if (args.IsValid) 
     $("#" + sender.controltovalidate) 
     .parent() 
     .children() 
     .filter("input:first") 
     .attr('ValidEntry', args.Value); 
} 

}

Ich ausnutzt, wie die AutoCompleteExtender macht den Eintrag zu überprüfen, ich weiß, eine Textbox gibt es für Ihre Ein Eintrag, ein Versteckter, der den letzten ausgewählten Wert enthält (wird nicht gefüllt, bis die Validierung durchgeht) und eine ungeordnete Liste (ul), die die Suchvorhersagen enthält.

Im Moment funktioniert das, aber ich weiß nicht, ob jemand eine Idee hat, wie man es weniger wie einen Hack aussehen lässt. Das aktuelle Problem besteht darin, dass das Validieren des aktuellen Eintrags anhand der Liste der Vorhersagen nur funktioniert, wenn die Validierung vom Steuerelement aufgerufen wird (da die ul ausgefüllt und unterhalb der Autocomplete-Box verfügbar ist). Wenn die Seite die Validierung aufruft, ist die ul nicht da, deshalb habe ich hinzugefügt, dass "wenn der aktuelle Eintrag der gleiche ist wie der letzte gültige Eintrag, nichts anderes überprüft wird".

Alle Ideen werden sehr geschätzt.

Antwort

0

Am Ende war das ein ziemlich guter Ansatz, plus ein paar kleine Änderungen. Vielleicht wird dies für jemanden nützlich sein, der versucht, dies zu implementieren ... da es ein sehr bekanntes Problem ist, dass die Validierung BEFORE ausgelöst wird, egal welchen js-Code Sie für den Extender OnClientItemSelected setzen.

1) Ich habe einen SelectedText ausgeblendet, um den letzten gültigen Text zu verfolgen, der in der Autocomplete eingegeben wurde. Dieses Feld wird über OnClientItemSelected aufgefüllt. Dies umfasst die Validierung während Postbacks und Validierung auf Seitenebene.

2) I modifizierte, um die die ValidateLookup Funktion zum CustomValidator angeschlossen:

function ValidateLookup(sender, args) { 
var selectedText = $("#" + sender.controltovalidate) 
        .parent() 
        .children() 
        .filter("[id$=_selectedText]").val(); 
var isValidEntry = args.Value != "" && selectedText == args.Value; 

if (isValidEntry) 
    args.IsValid = true; 
else { 
    var acEntries = $("#" + sender.controltovalidate) 
         .parent() 
         .children() 
         .filter(function() { 
          return this.innerText == args.Value; 
         }); 
    args.IsValid = acEntries.length > 0; 
} 
} 

Die Filterfunktion, die ich bin mit der Autocomplete-Box scannen einfach da mit Zeichen zu beschäftigen, die in der Regel müssen entkommen (Einträge in der Autovervollständigung mit Backslashes, Apostrophen usw.).

Verwandte Themen