Tengo una forma particularmente grande en una página. Cuando se valida el formulario y un campo no es válido, quiero desplazar la ventana hacia ese control. Llamar al foco del control() no parece hacer esto. He encontrado una solución alternativa de JavaScript para desplazar la ventana hacia el control, pero ¿hay algo incorporado en ASP.NET?ASP.NET: Desplácese hasta el control
Respuesta
Usted debe mira en jQuery y el plugin de ScrollTo
Adición MaintainScrollPositionOnPostback es el más cercano que ASP.NET ha incorporado, pero no necesariamente saltar al campo (s) no válido.
<%@ Page MaintainScrollPositionOnPostback="true" %>
¿Seguro Focus() no hará lo que usted describe? Bajo el capó, esencialmente está haciendo la "solución alternativa de JavaScript": escribe algunos JS en la página que llama a focus() en el control con el ID correspondiente:
Cualquiera que sea el control que Focus() haya llamado antes de que termine la página procesamiento escribe esto a la página:
<script type="text/javascript">
//<![CDATA[
WebForm_AutoFocus('txtFocus2');//]]>
</script>
que he logrado algo similar con HTML fragments básica. Que acaba de salir de un elemento con un ID conocida:
<span id="CONTROL-ID"></span>
Y a continuación, ya sea a través de la escritura, en el lado del servidor cambiar la url:
window.location += "#CONTROL-ID";
En el primer caso, la página no se volverá a cargar, simplemente se desplazará hacia abajo hasta el control.
SO Creo que el problema se debe a que estaba tratando de centrarme en HtmlGenericControls en lugar de WebControls.
yo sólo terminé haciendo una solución con sede fuera de:
http://ryanfarley.com/blog/archive/2004/12/21/1325.aspx http://www.codeproject.com/KB/aspnet/ViewControl.aspx
... en aras del tiempo.
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));
}
Uso:
if (!this.PropertyForm.Validate())
{
this.PropertyForm.ErrorMessage.ScrollTo();
failed = true;
}
(Aunque parece Page.RegisterClientScriptBlock() está en desuso para Page.ClientScript.RegisterClientScriptBlock()).
¿Está utilizando un Resumen de validación en su página?
Si es así, ASP.NET renders some javascript to automatically scroll to the top of the page que bien puede anular el comportamiento automático de la validación del lado del cliente para enfocar el último control no válido.
Además, ¿ha desactivado la validación del lado del cliente?
Si se echa un vistazo al JavaScript generado por la validación del lado del cliente debería ver métodos como éste:
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 de la llamada a ValidatorSetFocus, que es un método bastante largo que intenta establecer el foco para el control en cuestión, o si tiene varios errores, hasta el último control que fue validada, usando (con el tiempo) las siguientes líneas:
if (typeof(ctrl.focus) != "undefined" && ctrl.focus != null) {
ctrl.focus();
Page_InvalidControlToBeFocused = ctrl;
}
para conseguir este comportamiento a trabajar, lo ideal sería que asegurarse de que todos sus validadores están configurados t o ser del lado del cliente: los validadores del lado del servidor obviamente requerirán una devolución de datos, y eso podría afectar las cosas (es decir perder foco/posición) - y establecer MaintainScrollPositionOnPostBack en true probablemente haga que la página se vuelva a cargar al botón de enviar, en lugar de al elemento de formulario no válido.
Utilizando el lado del servidor. El método de enfoque causará que ASP.NET muestre javascript "en la carga de la página" (es decir, cerca de la parte inferior de la página) pero podría estar siendo anulado por uno de los otros mecanismos discutidos anteriormente .
solución muy simple es establecer la propiedad SetFocusOnError del RequiredFieldValidator (o el control de validación que está utilizando) a cierto
http://weblogs.asp.net/dfindley/archive/2007/06/29/a-quick-fix-for-the-validator-setfocusonerror-bug.aspx – softwaredeveloper
pegar el código JavaScript siguiente:
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;
}
A continuación, llame ScrollToFirstError() en su OnClientHaga clic en el botón que está guardando, asegúrese de que el botón tenga CausesValidation = true también.
Ahí lo tienes.
Page.MaintainScrollPositionOnPostBack = False
Page.SetFocus(txtManagerName)
Y exactamente dónde escribes 'Page.MaintainScrollPositionOnPostBack = Falso'? –
- 1. Desplácese hasta Resumen de validación: ASP.NET MVC
- 2. WPF ListBox Desplácese hasta el final automáticamente
- 3. Desplácese hasta el primer elemento de jcarousel
- 4. Desplácese hasta la parte inferior de C# TextBox
- 5. Javascript: desplácese hasta la enésima fila en una tabla?
- 6. Desplácese hasta la parte superior de la página
- 7. Desplácese hasta la parte inferior de C# DataGridView
- 8. Desplácese hasta el elemento seleccionado en el componente Lista de chispas de Flex 4
- 9. Desplácese hasta la parte superior del marco principal en el cambio de iframe?
- 10. Vista de lista Desplácese hasta el final de la lista después de actualizar la lista
- 11. Alerta utilizando Jquery cuando Desplácese hasta el final de la página
- 12. Desplácese hasta el último UITableViewCell utilizando scrollToRowAtIndexPath: atScrollPosition: animado utilizando NSFetchedResultsControllerDelegate métodos
- 13. Acceso al control principal desde el control secundario: ASP.NET C#
- 14. Swing: Desplácese hasta la parte inferior de JScrollPane, condicional en la ubicación de la ventana actual
- 15. asp.net literal control bgcolor
- 16. Html control y asp.net web control
- 17. ASP.NET Charting Control Transparency
- 18. textarea control, asp.net C#
- 19. ASP.NET - Validar el control dentro de UserControl
- 20. Control de paginación ASP.NET
- 21. UITextView, desplácese mientras edita?
- 22. Desplácese a WPF FlowDocumentScrollViewer desde el código?
- 23. Desplácese hacia arriba con el complemento slimscroll
- 24. jQuery Desplácese a Div
- 25. Desplácese con Firefox utilizando Watir Webdriver
- 26. LoadControl vs Construct ASP.Net Control
- 27. Control dinámico persistente en ASP.Net
- 28. Control de contenedor personalizado ASP.NET
- 29. Control personalizado en ASP.NET C#
- 30. El control Data Forms de Windows no reconoce el cambio hasta perder el foco
Eso no es lo que él está describiendo: quiere que la página salte a la parte del formulario que falló la validación, no necesariamente la posición que el usuario tenía la última vez. –
No responde la pregunta, pero resolvió * mi * problema. ¡Gracias! –