2009-04-14 15 views
8

Ho una forma particolarmente grande in una pagina. Quando il modulo è convalidato e un campo non è valido, voglio scorrere la finestra verso quel controllo. Chiamare Focus() del controllo non sembra farlo. Ho trovato una soluzione alternativa JavaScript per far scorrere la finestra sul controllo, ma c'è qualcosa di integrato in ASP.NET?ASP.NET: scorri per controllare

risposta

2

Aggiunta MaintainScrollPositionOnPostback è il più vicino che ASP.NET ha costruito in, ma non necessariamente passare al campo non valido (s).

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

Questo non è ciò che sta descrivendo: vuole che la pagina salti alla parte del modulo che non ha convalidato la convalida, non necessariamente la posizione dell'utente all'ultimo momento. –

+1

Non risponde alla domanda, ma ha risolto * il mio * problema. Grazie! –

1

Sei sicuro che Focus() non farà quello che stai descrivendo? Sotto il cofano, fa essenzialmente la "soluzione alternativa JavaScript", scrive JS alla pagina che chiama focus() sul controllo con l'ID corrispondente:

Qualunque controllo avesse Focus() chiamato l'ultima prima che la pagina finisca elaborazione scrive questo alla pagina:

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

ho realizzato qualcosa di simile utilizzando base HTML fragments. Basta lasciare un elemento con un ID di nota:

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

E allora o tramite script, sul lato server modificare l'URL:

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

Nel primo caso la pagina non si ricaricherà, scorrerà verso il basso fino al controllo.

5

SO Credo che il problema è perché stavo cercando di concentrarsi su HtmlGenericControls invece di WebControls.

ho appena finito per fare una soluzione in base al largo di:

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

... nell'interesse di tempo.

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)); 
} 

Usage:

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

(Anche se sembra Page.RegisterClientScriptBlock() è deprecato per Page.ClientScript.RegisterClientScriptBlock()).

5

Stai utilizzando un riepilogo di convalida nella tua pagina?

In tal caso, ASP.NET renders some javascript to automatically scroll to the top of the page, che potrebbe sovrascrivere il comportamento automatico della convalida lato client per mettere a fuoco l'ultimo controllo non valido.

Inoltre, è stata disattivata la convalida del lato client?

Se si dà un'occhiata al javascript generato dalla validazione lato client si dovrebbe vedere metodi come questo:

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); 
} 

nota la chiamata a ValidatorSetFocus, che è un metodo piuttosto lungo che tenta di impostare la messa a fuoco al controllo in questione, o se si dispone di più errori, per l'ultimo controllo che è stato convalidato, con (eventualmente) le seguenti righe:

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

per ottenere questo comportamento al lavoro, si sarebbe idealmente bisogno di assicurare che tutti i tuoi validatori sono impostati t o essere lato client - i validatori lato server richiederanno ovviamente un postback e ciò potrebbe influenzare le cose (ad es. perdere focus/posizione) - e impostare MaintainScrollPositionOnPostBack su true probabilmente farebbe ricaricare la pagina sul pulsante di invio, piuttosto che sull'elemento di modulo non valido.

Utilizzo lato server. Il metodo di messa a fuoco farà sì che ASP.NET esegua il rendering di alcuni javascript "sul caricamento della pagina" (cioè in prossimità della parte inferiore della pagina) ma questo potrebbe essere annullato da uno degli altri meccanismi discussi sopra .

2

Molto semplice soluzione è quella di impostare la proprietà SetFocusOnError del RequiredFieldValidator (o qualsiasi controllo di convalida che si sta utilizzando) true

+0

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

0

Incollare il seguente 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; 
    } 

Quindi chiamare ScrollToFirstError() nella vostra OnClientFare clic sul pulsante che si sta salvando, assicurarsi che il pulsante abbia anche CausesValidation = true.

Là ce l'hai.

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

Ed esattamente dove scrivi 'Page.MaintainScrollPositionOnPostBack = Falso'? –

Problemi correlati