2009-03-30 15 views
51

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.Resumen de validación de ASP.Net hace que la página salte al principio

Aquí está 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" /> 

He tratado de establecer SetFocusOnError="true" en el validador de campo requerido y MaintainScrollPositionOnPostback="true" por diversión - a pesar de que esto no es una devolución de datos - sin ninguna suerte. ¿Hay una solución conocida para este problema?

EDIT:

he encontrado el problema en el js generados 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 omitir esto?

Edit2:

trabajo rápido alrededor por el momento:

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

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

Edit3:

Parece una mejor solución es simplemente reemplazar la función window.scrollTo() de modo que no hace nada cuando se le llama por el script de validación:

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

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

+0

No estoy familiarizado con esto, pero ¿agrega un '#' al final de su URL? A veces, esto hará que la página salte a la cima. –

+0

@cory, no html genera una entrada de botón de envío no un enlace de ancla – Adam

+0

Para edit3: Esto no ayuda cuando tiene un resumen de validación en la parte superior de la página y uno en la parte inferior. El superior nunca se enfoca. –

Respuesta

41

dos arounds de trabajo posible:

validación del cliente Desactivar y salto para corregir la posición de poste trasero:

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

Desactivar la función scrollTo en javascript:

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

Esto es lo que me solucionó: <% @ Page Language = "C#" AutoEventWireup = "true" CodeFile = "Default.aspx.cs" Inherits = "_ Predeterminado" MaintainScrollPositionOnPostback = "true"%> –

+1

This won ' t Enfoque el resumen en la parte superior si hay dos resúmenes en la página (1 en la parte superior, 2 en la parte inferior) –

+0

-1, no funcionó para mí. Tengo una mezcla de validación del lado del cliente y del lado del servidor. El uso de uno de estos métodos para corregir el desplazamiento hará que la página se desplace hacia la parte superior del otro. Usar ambos tampoco lo arregla. – jcollum

-2

Consulte cómo establecer el esquema de destino para su html.

Trate http://msdn.microsoft.com/en-us/library/6379d90d(VS.71).aspx

Antes de VS 2005 se podría establecer el esquema de una página de nivel de página.

Solo un pensamiento.

+0

No estoy seguro de seguir. Esto no parece ser específico del navegador – Adam

+0

la declaración no es coherente. Y los pensamientos no son apropiados como respuestas. Pertenecen como COMENTARIOS !!!!!! –

0

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 puede intentar desactivar el resumen de validación.

+0

@sausemaster, la página salta a la cima sin importar dónde coloque el resumen de validación. cuando desactivo el resumen de validación, no salta, pero desafortunadamente esa es la única cosa que se requiere – Adam

+0

Ok. Creo que puede que esté atascado al escribir algunos javascript para tener un foco de llamada de control cuando haga clic en Enviar de algo similar. Una búsqueda rápida en Google devolvió este tema del foro (http://forums.asp.net/t/1089469.aspx). Lo siento y lo mejor de las suertes. – AndyG

+0

Tengo 3 resúmenes, y siempre salta a la cima. – thomasb

-1

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

0

yo estaba corriendo en 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 tiene que tener la función scrollTo blanqueó a cabo:

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

ya dispone del código (en su mayoría) from here.

15

Esto es known bug, como se documenta en Microsoft Connect. El relevant issue tiene la base para el mejor trabajo en torno a:

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

La solución en los comentarios de ese tema no cuenta para los grupos de validación, e introduce nuevas variables en el alcance global. En la pestaña de solución del problema, publiqué una solución actualizada que toma en cuenta esos problemas. – bdukes

+2

Aquí está la solución actualizada de @bdukes, en caso de que la página vinculada se pierde: ' (function() {var originalValidationSummaryOnSubmit = window.ValidationSummaryOnSubmit; window.ValidationSummaryOnSubmit = function (ValidationGroup) {var originalScrollTo = window.scrollTo ; window.scrollTo = function() {}; originalValidationSummaryOnSubmit (ValidationGroup); window.scrollTo = originalScrollTo; }} ()); ' –

+0

@Frederic, usted debe publicar solución que actualizado como una respuesta completa por lo que se puede votar con un reconocimiento de Cleek y bdukes. –

11

En lugar de

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

que indiscriminadamente anular la función ScrollTo para todas las devoluciones de datos, puse la función en mi caso 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 que ha hecho el trabajo por mí.

+0

Una sugerencia sensata que funciona muy bien y evita las otras trampas descubiertas por otros. +1 – EvilDr

+1

Funciona una vez hasta que se hace clic en el botón, luego se pierde scrollto –

5

utilizo este: (requiere jQuery y jquery.scrollTo)

En primer lugar, poner un ancla con una clase específica sobre el resumen de validación, así:

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

continuación, incluyen 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, al que sustituye, cuando sea necesario, la función ValidationSummaryOnSubmit con una versión del tha t deshabilita temporalmente window.scrollTo y se desplaza al anclaje. No debería ser difícil de modificar para que no use jquery.

9

Según lo indicado por cleek's answer, este es un known bug que tiene soluciones.

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

(Él no ha publicado directamente aquí en la SO, y ahora el connect issue parece requerir inscripción para ser visto, lo que hace que su solución más difíciles de acceder.)

Cuestiones relacionadas