tag route net for data asp all asp.net validation

route - El resumen de validación de ASP.Net hace que la página salte al principio



net core asp route id (9)

¿Quizás podría heredar del validador de campo requerido y anular la validación del lado del cliente en un control personalizado?

Tengo un formulario simple con algunos validadores de campo requeridos y un control de resumen de validación. Cuando envío el formulario, la validación del cliente hará que el formulario salte a la parte superior de la página. Si elimino el resumen de validación, la página no se mueve.

Aquí hay un ejemplo rápido:

<asp:TextBox ID="test" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="testrequired" runat="server" ControlToValidate="test">*</asp:RequiredFieldValidator> <asp:ValidationSummary ID="summary" runat="server" /> <asp:Button ID="submit" runat="server" Text="submit" />

Intenté configurar SetFocusOnError="true" en el validador de campo requerido y MaintainScrollPositionOnPostback="true" para risitas (aunque esto no es una devolución de datos) sin suerte. ¿Hay una solución conocida para este problema?

EDITAR:

He encontrado el problema en el js generado por WebResource.axd. Parece que se reduce a una sola línea en la función ValidationSummaryOnSubmit() .

line 534: window.scrollTo(0,0);

¿Alguna idea sobre cómo eliminar o eludir esto?

EDIT2:

Rápido trabajo por el momento:

  • establecer EnableClientScript="false" para todos los controles de validación (deshabilitar la validación del cliente)
  • establecer MaintainScrollPositionOnPostback="true" en la directiva de la página

Todavía esperando una solución del lado del cliente ...

EDIT3:

Parece que una solución mejor es anular la función window.scrollTo() para que no haga nada cuando el script de validación lo llame:

<script type="text/javascript"> window.scrollTo = function() { } </script>

Agregar lo anterior en cualquier lugar de la página deja la validación del cliente intacta, pero deshabilita el método window.scrollTo() toda la página


Dos posibles soluciones alternativas:

Desactive la validación del cliente y salte a la posición correcta en la parte posterior de la publicación:

* set EnableClientScript="false" for all validation controls (disabling client validation) * set MaintainScrollPositionOnPostback="true" in Page directive

Deshabilite la función scrollTo en javascript:

<script type="text/javascript"> window.scrollTo = function() { } </script>


En lugar de

<script type="text/javascript"> window.scrollTo = function() { return true; } </script>

que invalidaría indiscriminadamente la función ScrollTo para todas las devoluciones, puse la función en mi evento OnClientClick del botón. Como a continuación.

onClientClick="window.scrollTo = function(x,y) { return true; };"

No estoy seguro de si es la mejor solución, pero parece haber hecho el trabajo por mí.


Este es un error conocido , como se documenta en Microsoft Connect. El tema relevante tiene la base para el mejor trabajo alrededor:

var ValidationSummaryOnSubmitOrig = ValidationSummaryOnSubmit; var ValidationSummaryOnSubmit = function() { var scrollToOrig = window.scrollTo; window.scrollTo = function() { }; var retVal = ValidationSummaryOnSubmitOrig(); window.scrollTo = scrollToOrig; return retVal; }


La página pasará a donde esté su resumen de validación. Si desea que permanezca cerca de la parte inferior, mueva el resumen de validación hacia abajo cerca del botón de enviar.

EDITAR, también puedes intentar desactivar el resumen de validación.


Me encontré con un problema donde usar MaintainScrollPositionOnPostback=true funcionaría pero rompería la posición de desplazamiento de validación del lado del cliente. Así que agregué un script para mostrar el control de resumen de validación en una devolución de datos.

private void FocusControlOnPageLoad(Control ctrl) { this.Page.ClientScript.RegisterClientScriptBlock( typeof(System.Web.UI.Page), "ctrlFocus", @"<script> function ScrollView() { var el = document.getElementById(''" + ctrl.ClientID + @"'') if (el != null) { el.scrollIntoView(); el.focus(); } } window.onload = ScrollView; </script>"); }

con:

protected void Page_PreRender(object sender, EventArgs e) { if (Page.IsValid == false) { FocusControlOnPageLoad(TheValidationSummary); } }

Parece que también tengo que tener la función scrollTo en blanco:

window.scrollTo = function() { return true; }

Obtuve el código (principalmente) de aquí .



Según lo declarado por share , este es un error conocido que tiene soluciones provisionales.

Aquí está bdukes one , que me parece el mejor disponible actualmente.

(function () { var originalValidationSummaryOnSubmit = window.ValidationSummaryOnSubmit; window.ValidationSummaryOnSubmit = function (validationGroup) { var originalScrollTo = window.scrollTo; window.scrollTo = function() { }; originalValidationSummaryOnSubmit(validationGroup); window.scrollTo = originalScrollTo; } }());

(No lo ha publicado directamente aquí en SO, y ahora el problema de conexión parece requerir registro para ser visto, lo que hace que su solución sea más difícil de acceder.)


Yo uso esto: (requiere jquery y jquery.scrollTo)

Primero coloque un ancla con una clase específica encima de su resumen de validación, de esta manera:

<a class="custom_valsum_anchor" /> <asp:ValidationSummary ID="valSum" runat="server" EnableClientScript="true" />

luego incluye este bit de javascript:

$(document).ready( function () { var $valSum = $(".custom_valsum_anchor"); if ($valSum.size() > 0) { var backup_ValidationSummaryOnSubmit = ValidationSummaryOnSubmit; ValidationSummaryOnSubmit = function (validationGroup) { var backup_ScrollTo = window.scrollTo; window.scrollTo = function () { }; backup_ValidationSummaryOnSubmit(validationGroup); window.scrollTo = backup_ScrollTo; setTimeout(function () { $("body").scrollTo($valSum); }, 1); }; } } );

Básicamente, reemplaza, cuando es necesario, la función ValidationSummaryOnSubmit con una versión que deshabilita temporalmente window.scrollTo y se desplaza al ancla. No debería ser difícil de modificar para que no use jquery.