2009-04-14 13 views
8

Mam szczególnie dużą formę na stronie. Po sprawdzeniu poprawności formularza i niepoprawnym polu chcę przewinąć okno do tej kontrolki. Wywołanie funkcji Focus() nie wydaje się tego robić. Znalazłem sposób obejścia kodu JavaScript, aby przewinąć okno do formantu, ale czy jest coś wbudowanego w ASP.NET?ASP.NET: Przewiń, aby kontrolować

Odpowiedz

2

Dodawanie MaintainScrollPositionOnPostback jest najbliżej że ASP.NET ma wbudowane, ale niekoniecznie będzie przeskoczyć do pola nieprawidłowej (ów).

<%@ Page MaintainScrollPositionOnPostback="true" %> 
+1

To nie jest to, co on opisuje - chce, aby strona przeskoczyła do części formularza, której nie udało się sprawdzić, niekoniecznie pozycji użytkownika w ostatnim czasie. –

+1

Nie odpowiada na pytanie, ale rozwiązał * mój * problem. Dzięki! –

1

Czy jesteś pewien, że Focus() nie zrobi tego, co opisujesz? Pod maską jest to zasadniczo "obejście w języku JavaScript" - zapisuje niektóre JS na stronie, która wywołuje fokus() na formancie z pasującym identyfikatorem:

Niezależnie od tego, która kontrola miała fokus(), który był ostatni przed zakończeniem strony przetwarzanie zapisuje to na stronie:

<script type="text/javascript"> 
//<![CDATA[ 
WebForm_AutoFocus('txtFocus2');//]]> 
</script> 
0

Osiągnąłem coś podobnego używając podstawowego HTML fragments. Po prostu zostawić element z rozpoznaną ID:

<span id="CONTROL-ID"></span> 

A potem za pośrednictwem skryptu na stronie serwera zmienić URL:

window.location += "#CONTROL-ID"; 

W pierwszym przypadku strona nie będzie przeładować, po prostu przewinie się do kontroli.

5

SO Wierzę, że problem polega na tym, że próbowałem skupić się na HtmlGenericControls zamiast WebControls.

Właśnie zakończyła się robi obejście oparciu off:

http://ryanfarley.com/blog/archive/2004/12/21/1325.aspx http://www.codeproject.com/KB/aspnet/ViewControl.aspx

... w interesie czasie.

public static void ScrollTo(this HtmlGenericControl control) 
{ 
    control.Page.RegisterClientScriptBlock("ScrollTo", string.Format(@" 

     <script type='text/javascript'> 

      $(document).ready(function() {{ 
       var element = document.getElementById('{0}'); 
       element.scrollIntoView(); 
       element.focus(); 
      }}); 

     </script> 

    ", control.ClientID)); 
} 

Zastosowanie:

if (!this.PropertyForm.Validate()) 
{ 
    this.PropertyForm.ErrorMessage.ScrollTo(); 
    failed = true; 
} 

(Choć wydaje Page.RegisterClientScriptBlock() nie jest zalecane dla Page.ClientScript.RegisterClientScriptBlock()).

5

Czy używasz podsumowania sprawdzania poprawności na swojej stronie?

Jeśli tak, ASP.NET renders some javascript to automatically scroll to the top of the page, który może również zastąpić automatyczne zachowanie sprawdzania po stronie klienta, aby ustawić ostatnią nieprawidłową kontrolę.

Co więcej, czy sprawdziłeś poprawność strony klienta?

Jeśli przyjrzeć javascript generowanego przez walidacji po stronie klienta powinien pojawić metody takie jak to:

function ValidatorValidate(val, validationGroup, event) { 
    val.isvalid = true; 
    if ((typeof(val.enabled) == "undefined" || val.enabled != false) && 
     IsValidationGroupMatch(val, validationGroup)) { 
    if (typeof(val.evaluationfunction) == "function") { 
     val.isvalid = val.evaluationfunction(val); 
     if (!val.isvalid && Page_InvalidControlToBeFocused == null && 
      typeof(val.focusOnError) == "string" && val.focusOnError == "t") { 
     ValidatorSetFocus(val, event); 
     } 
    } 
    } 
    ValidatorUpdateDisplay(val); 
} 

Uwaga wywołanie ValidatorSetFocus, który jest dość długi metoda, która próbuje ustawić ostrość z kontrolą, o którym mowa, lub jeśli masz kilka błędów, do ostatniej kontroli, który został zatwierdzony, stosując (ostatecznie) następujące wiersze:

if (typeof(ctrl.focus) != "undefined" && ctrl.focus != null) { 
    ctrl.focus(); 
    Page_InvalidControlToBeFocused = ctrl; 
} 

aby uzyskać ten problem do pracy, to byłoby idealnie trzeba upewnić się, że wszystkie twoje walidatory są ustawione t o po stronie klienta - weryfikatory po stronie serwera będą oczywiście wymagały odświeżenia strony, co może wpływać na pewne rzeczy (np. tracić ostrość/pozycję) - ustawienie parametru MaintainScrollPositionOnPostBack na wartość true prawdopodobnie spowodowałoby ponowne załadowanie strony do przycisku przesyłania, a nie nieprawidłowy element formularza.

Korzystanie ze strony serwera Metoda AFFocus spowoduje, że program ASP.NET wyrenderuje część javascript "na stronie" (tj. W pobliżu dolnej części strony), ale może to zostać zastąpione przez jeden z innych mechanizmów wymienionych powyżej .

2

Bardzo prostym rozwiązaniem jest ustawić właściwość SetFocusOnError z RequiredFieldValidator (lub cokolwiek sterowania walidator używasz) do prawdziwej

+0

http://weblogs.asp.net/dfindley/archive/2007/06/29/a-quick-fix-for-the-validator-setfocusonerror-bug.aspx – softwaredeveloper

0

Wklej następujący Javascript:

function ScrollToFirstError() { 
     Page_ClientValidate(); 
     if (Page_IsValid == false) { 
      var topMostValidator; 
      var lastOffsetTop; 
      for (var i = 0; i < Page_Validators.length; i++) { 
       var vld = Page_Validators[i]; 
       if (vld.isvalid == false) { 
        if (PageOffset(vld) < lastOffsetTop || lastOffsetTop == undefined) { 
         topMostValidator = vld; 
         lastOffsetTop = vld.offsetTop; 
        } 
       } 
      } 
      topMostValidator.scrollIntoView(); 
     } 
     return Page_IsValid; 
    } 

    function PageOffset(theElement) { 
     var selectedPosY = 0; 
     while (theElement != null) { 
      selectedPosY += theElement.offsetTop; 
      theElement = theElement.offsetParent; 
     } 
     return selectedPosY; 
    } 

Następnie zadzwonić ScrollToFirstError() w OnClientClick przycisku, który jest zapisywany, upewnij się, że przycisk ma także funkcję PrzyczynyValidation = true.

Masz to.

6
Page.MaintainScrollPositionOnPostBack = False 
Page.SetFocus(txtManagerName) 
+0

A gdzie dokładnie piszesz 'Page.MaintainScrollPositionOnPostBack = Fałszywe? –

Powiązane problemy