Ich habe eine besonders große Form in einer Seite. Wenn das Formular validiert wird und ein Feld ungültig ist, möchte ich das Fenster zu diesem Steuerelement scrollen. Der Aufruf des Focus () des Steuerelements scheint dies nicht zu tun. Ich habe eine JavaScript-Problemumgehung gefunden, um das Fenster zum Steuerelement zu scrollen, aber ist irgendetwas in ASP.NET integriert?
Verwenden Sie eine Validierungszusammenfassung auf Ihrer Seite?
Wenn ja, ASP.NET rendert Javascript um automatisch zum Anfang der Seite zu scrollen , was möglicherweise das automatische Verhalten der clientseitigen Validierung außer Kraft setzt, um das letzte ungültige Steuerelement zu fokussieren.
Haben Sie auch die Validierung der Clientseite deaktiviert?
Wenn Sie sich das von der clientseitigen Validierung generierte Javascript ansehen, sollten Sie folgende Methoden sehen:
%Vor%Beachten Sie den Aufruf von ValidatorSetFocus, einer ziemlich langen Methode, die versucht, den Fokus auf das fragliche Steuerelement oder bei mehreren Fehlern auf das letzte Steuerelement, das validiert wurde, zu setzen. Dabei werden (möglicherweise) die folgenden Zeilen verwendet:
%Vor%Damit dieses Verhalten funktioniert, sollten Sie idealerweise sicherstellen, dass alle Ihre Validatoren als clientseitig festgelegt sind. Server-seitige Validatoren erfordern offensichtlich ein Postback, das sich auf Dinge auswirken kann (z. B. Fokus / Position verlieren). und das Setzen von MaintainScrollPositionOnPostBack auf True würde wahrscheinlich dazu führen, dass die Seite erneut auf die Übermittlungsschaltfläche geladen wird, anstatt das ungültige Formularelement.
Verwendung der Server-Seite. Die Focus-Methode bewirkt, dass ASP.NET beim Laden der Seite etwas JavaScript "raufruft" (dh am unteren Rand der Seite), aber dies könnte durch einen der anderen oben genannten Mechanismen überschrieben werden.
SO Ich glaube, das Problem liegt daran, dass ich versucht habe, mich auf HtmlGenericControls anstatt auf WebControls zu konzentrieren.
Ich habe gerade einen Workaround gemacht, basierend auf:
... im Interesse der Zeit.
%Vor%Verwendung:
%Vor%(Obwohl es scheint, dass Page.RegisterClientScriptBlock () für Page.ClientScript.RegisterClientScriptBlock ()) veraltet ist.
Das Hinzufügen von MaintainScrollPositionOnPostback ist das nächste, das ASP.NET eingebaut hat, springt aber nicht unbedingt zu den ungültigen Feldern.
%Vor%Sehr einfache Lösung ist, die SetFocusOnError-Eigenschaft des RequiredFieldValidator (oder welches Validator-Steuerelement Sie verwenden) auf True
festzulegenSind Sie sicher, Focus () wird dies nicht tun Mach was du beschreibst? Unter der Haube macht es im Wesentlichen die "JavaScript Workaround" - es schreibt einige JS auf die Seite, die focus () auf das Steuerelement mit der passenden ID aufruft:
Welches Steuerelement Focus () zuletzt aufgerufen hat, bevor die Seite die Verarbeitung beendet, schreibt dies auf die Seite:
%Vor%Ich habe etwas Ähnliches mit einfachen HTML-Fragmenten erreicht. Sie hinterlassen nur ein Element mit einer bekannten ID:
%Vor%Und dann entweder per Skript, auf der Serverseite die URL ändern:
%Vor%Im ersten Fall wird die Seite nicht neu geladen, sondern nur nach unten zum Steuerelement gescrollt.
Fügen Sie das folgende Javascript ein:
%Vor%Rufen Sie dann ScrollToFirstError () in Ihrem OnClientClick des zu speichernden Buttons auf und stellen Sie sicher, dass der Button CausesValidation = true hat.
Da hast du es.