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
Si dovrebbe guarda in jQuery e il plugin di scrollTo
Aggiunta MaintainScrollPositionOnPostback è il più vicino che ASP.NET ha costruito in, ma non necessariamente passare al campo non valido (s).
<%@ Page MaintainScrollPositionOnPostback="true" %>
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>
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.
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()).
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 .
Molto semplice soluzione è quella di impostare la proprietà SetFocusOnError del RequiredFieldValidator (o qualsiasi controllo di convalida che si sta utilizzando) true
http://weblogs.asp.net/dfindley/archive/2007/06/29/a-quick-fix-for-the-validator-setfocusonerror-bug.aspx – softwaredeveloper
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.
Page.MaintainScrollPositionOnPostBack = False
Page.SetFocus(txtManagerName)
Ed esattamente dove scrivi 'Page.MaintainScrollPositionOnPostBack = Falso'? –
- 1. Scorri per eliminare
- 2. Scorri per cambiare visualizzazione
- 3. Scorri per eliminare UITableView
- 4. LibGDX - Scorri verso l'alto o scorri verso destra ecc.?
- 5. Scorri verso Dismiss per RecyclerView
- 6. Scorri per eliminare non funziona
- 7. scorri per eliminare TableView Row
- 8. Scorri una ListView per pixel in Android
- 9. UITableView "Scorri verso il basso per aggiornare"
- 10. Scorri tra le immagini filtrate per Android
- 11. Scorrimento orizzontale - Mobile - scorri?
- 12. Scorri UIView utilizzando kCATransitionPush
- 13. Scorri UITextView To Bottom
- 14. PHP controllare per NULL
- 15. Visualizzazione griglia Android Scorri orizzontalmente
- 16. Scorri più RecyclerView orizzontale insieme
- 17. JQuery Detect Scorri in basso
- 18. Scorri/Passa all'ID senza jQuery
- 19. Android NYTimes Scorri animazione/gesti
- 20. Asp.Net Controllare la dimensione del file prima del caricamento
- 21. Stile Android SearchView Scorri popup
- 22. controllare se un file esiste nel server in ASP.NET
- 23. Controllare se la casella è selezionata o meno - ASP.NET
- 24. ASP.NET MVC Controllare il ruolo all'interno della vista
- 25. Scorri immagine WPF per cambiare immagine come in iOS
- 26. Schede + Scorri in Android per tutti i livelli API
- 27. Scorri per eliminare l'opzione nei problemi di UITableView
- 28. Scorri per eliminare su una tabellaVisualizza all'interno di una paginaViewController
- 29. scorri per eliminare quando già in modalità di modifica
- 30. Scorri l'albero di ricerca binario per trovare tutte le foglie
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. –
Non risponde alla domanda, ma ha risolto * il mio * problema. Grazie! –