2016-04-27 10 views
2

Ich versuche, den richtigen Weg zum Entfernen einer Klasse von einem Element Client-Seite zu bestimmen und diese Entfernung in der ViewState beibehalten. Zum Beispiel habe ich ein Formular mit einem benutzerdefinierten Validator. Der benutzerdefinierte Prüfer wird feststellen, dass ein oder mehrere Felder ungültige Eingaben enthalten. Es wird dann eine CSS-Klasse auf das Element hinzufügen, so dass es rot angezeigt:ASP Web Forms Entfernen der Klasse Client-Seite von ViewState

TextBox_UserName.CssClass += " error"; 

Auf der Client-Seite habe ich eine onkeyup Funktion haben, die die Klasse entfernen wird, so dass, wenn der Benutzer beginnt, in das Feld eingeben es auf den Standardstil geht zurück:

<asp:TextBox ID="TextBox_UserName" runat="server" onkeyup="clearError(event, this)" /> 

die Javascript-Funktion ist ziemlich einfach:

function clearError(event, elem) { 
    if (event.keyCode != 9 && event.keyCode != 16 && event.keyCode != 13) 
     $(elem).removeClass('error'); 
} 

dies das funktioniert gut, aber das Problem in ich renne ist; Wenn der Benutzer einen Wert eingibt, der die Fehlerklasse löscht, ändert er den Wert eines anderen Steuerelements in dem Formular, das einen Post zurück verursacht. Wenn das Formular nach dem Post erneut geladen wird, liegt die Fehlerklasse wieder im Steuerelement TextBox_UserName. Ich gehe davon aus, dass dies passiert, weil die Klasse über Code-Behind hinzugefügt wird und somit in ViewState gespeichert wird.

Gibt es eine Möglichkeit, ich kann die Klasse eines Elementes Client-Seite entfernen oder aktualisieren und diese Änderung in ViewState widerspiegeln?

Das einzige, was ich denken kann, ist das Hinzufügen von Logik zum Code-Behind, aber das Formular, mit dem ich arbeite, hat eine große Anzahl von Feldern, so dass dies nicht ideal ist. Die andere Option wäre, einen Telerik AjaxManager zu verwenden, so dass nur die Felder, die Postbacks verursachen, vom Postback betroffen sind, aber das ist auch nicht wirklich ideal. Ich hoffe, es gibt eine bessere oder effizientere Art zu tun, was ich versuche, mit Javascript zu erreichen. Ich hatte kein Glück, eine Lösung zu finden, weil alles, was ich finde, davon redet, wie das Ändern des ViewState zu Fehlern führt (und ich möchte das auch nicht entfernen).

EDIT: Ich habe für diese Lösung entschieden:

In meiner benutzerdefinierten Validator Methode, die ich die Fehlerklasse lösche von allen Kontrollen, die betroffen sein können. Ich überprüfe dann, ob jedes Feld gültig ist, und füge dann die Fehlerklasse zu den Feldern hinzu, die meine Prüfungen nicht bestehen. Dann aktualisiere ich den Wert eines versteckten Feldes, um anzuzeigen, dass die Validierung im Formular stattgefunden hat.

In den Verfahren, die die Ereignisse der Steuerelemente handhaben, die Post Rücken auslösen, überprüfe ich, wenn die Validierung aufgetreten ist und falls ja, ich mache einen Anruf an:

Page.Validate(); 

Dies werde meinen eigenen Prüfer wieder auslösen und da es zuerst die Fehlerklassen löscht, aktualisiert es die css-Klasse für die Felder, die nicht vom Benutzer festgelegt wurden, während die festen Felder allein belassen werden.

+2

Machen Sie einen Schritt zurück und überdenken Sie, was Sie tun. Sie verwenden Validatoren, aber Sie stören ihren Workflow.Vielleicht gibt es eine Möglichkeit, sie "richtig" zu verwenden, und daher keinen zusätzlichen Code schreiben zu müssen, um die Dinge am Laufen zu halten. – Alexander

+0

Danke für die Eingabe. Ich bin mir nicht sicher, was du meinst. Ich versuche nur, die Elemente zu stylen, die bei der Validierung fehlschlagen, während der Benutzer das Problem beheben kann und seinerseits den Stil löscht, der anzeigt, dass ein Problem vorliegt, während das im ViewState beibehalten wird, sodass zukünftige Postbacks den Fehler nicht verursachen Stil, um wiederzukommen. Können Sie bitte näher erläutern, wie ich mich in den Workflow des Validators einmache, damit ich ein besseres Verständnis habe, das es mir ermöglicht, eine bessere Lösung zu finden? Ich habe meine Frage bearbeitet, um zu erklären, wie ich sie gelöst habe, aber vielleicht ist es nicht der beste Ansatz. –

+1

Das ist was ich meine. Die Validatoren sollen sich um das Styling kümmern. Wenn du anfängst "einzugreifen", verlässt du die beabsichtigte Art, wie sie arbeiten. Um sicher zu sein, würde ich Code hinter _und_ clientseitige Validierung für einen benutzerdefinierten Validator schreiben. Dann sollte es dir gut gehen. – Alexander

Antwort

1

Es ist wahr, dass Sie den Ansichtszustand auf der Clientseite nicht ändern können. Wie wäre es, wenn Sie alle Steuerelemente, die einen Beitrag verursachen, in ein Update-Fenster zurücklegen? Auf diese Weise sind nur diese Steuerelemente während eines Post-Backs betroffen. Persönlich bevorzuge ich die Verwendung der AJAX-Funktion in jQuery für partielle Postbacks, weil es viel leichter ist. Da Sie jedoch Web Forms verwenden, wäre ein Update-Panel eine schnelle Lösung, wenn Sie mit jQuery AJAX nicht vertraut sind.

Eine andere Option wäre, den Status der Textbox in einem versteckten Feld zu speichern. Dann würde der Servercode wissen, welche Klasse auf die Textbox angewendet werden soll.

+1

Das sind gute Lösungen. Ich wollte vermeiden, einzelne Steuerelemente in UpdatePanels/AjaxPanels zu umhüllen (das Projekt, in dem ich arbeite, verwendet Telerik-Steuerelemente). Der Hauptgrund dafür ist, dass das gesamte Formular bereits in einem AjaxPanel eingeschlossen ist, also möchte ich es nicht aufteilen. Ich habe mich dafür entschieden, ein verstecktes Feld zu verwenden, aber auf eine andere Weise als Ihr Vorschlag, da ich denke, dass es weniger Änderungen erfordert. Ich habe meine Frage bearbeitet, um zu erklären, was ich getan habe. –

Verwandte Themen