¿En asp.net cuando envío el formulario y lo actualizo, los datos vuelven a enviarse nuevamente? ¿Hay alguna manera en C# de atrapar el evento de actualización de página en la carga de la página?la actualización de la página está volviendo a activar el evento
Respuesta
ASP.NET no proporciona una forma de hacerlo directamente.
Hay algunas técnicas, por otro lado, para evitar la presentación duplicado:
redirección después de la presentación. Este es el peor. Incluso si evita la presentación duplicada, no es aceptable en una aplicación web moderna desde el punto de vista de los usuarios.
Seguimiento de envíos por formulario, por sesión. Cuando el usuario envía un formulario por primera vez, recuerde esto en la sesión. Si ocurre otro envío, intente determinar si debe descartarse o no (en algunos casos, no debe, por ejemplo, si edito mi respuesta en StackOverflow una vez, podría hacerlo dos veces si fuera necesario).
Desactivar el envío con JavaScript después del primer envío. Esto evita en algunos casos la situación cuando el usuario hace doble clic en el botón de envío, o hace clic por primera vez, espera y cree que el formulario no se envió, por lo que hace clic por segunda vez. Por supuesto, no confíe en este: JavaScript puede estar deshabilitado, funcionará haciendo doble clic pero no en actualización F5, y en todos los casos la técnica no es completamente confiable.
Como ilustración, intentemos implementar la segunda.
Digamos que tenemos un cuadro de comentario this.textBoxComment
que permite a los usuarios agregar un nuevo comentario en una página de un blog. La presentación se hace así:
private void Page_Load(object sender, System.EventArgs e)
{
if (this.IsPostBack)
{
string comment = this.ValidateCommentInput(this.textBoxComment.Text);
if (comment != null)
{
this.databaseContext.AddComment(comment);
}
}
}
Si el usuario hace clic dos veces, el comentario se publicará dos veces.
Ahora, vamos a añadir un poco de seguimiento de sesión:
private void Page_Load(object sender, System.EventArgs e)
{
if (this.IsPostBack)
{
if (this.Session["commentAdded"] == null)
{
string comment = this.ValidateCommentInput(this.textBoxComment.Text);
if (comment != null)
{
this.databaseContext.AddComment(comment);
this.Session.Add("commentAdded", true);
}
}
else
{
// TODO: Inform the user that the comment cannot be submitted
// several times.
}
}
}
En este caso, el usuario será capaz de enviar un comentario sólo una vez. Todos los demás comentarios se descartarán automáticamente.
El problema es que el usuario puede querer agregar comentarios a varias publicaciones de blog. Tenemos dos formas posibles de permitir eso. El más fácil es restablecer la variable de sesión en cada solicitud que no sea de devolución, pero esto permitirá al usuario enviar una publicación en una página, cargar otra página, luego presionar Actualizar en la primera, enviando el comentario dos veces pero sin ser capaz de agregar un comentario en la segunda página por más tiempo.
private void Page_Load(object sender, System.EventArgs e)
{
if (this.IsPostBack)
{
if (this.Session["commentAdded"] == null)
{
string comment = this.ValidateCommentInput(this.textBoxComment.Text);
if (comment != null)
{
this.databaseContext.AddComment(comment);
this.Session.Add("commentAdded", true);
}
}
else
{
// TODO: Inform the user that the comment cannot be submitted
// several times.
}
}
else
{
this.Session.Remove("commentAdded");
}
}
El más avanzado es el del seguimiento de sesión de la lista de páginas en las que se presentó el comentario.
private void Page_Load(object sender, System.EventArgs e)
{
List<string> commentsTrack = this.Session["commentAdded"] as List<string>;
string blogPostId = this.ValidatePostId(this.Request.QueryString["id"]);
if (blogPostId != null)
{
if (this.IsPostBack)
{
this.AddComment(commentsTrack);
}
else
{
if (commentsTrack != null && commentsTrack.Contains(blogPostId))
{
commentsTrack.Remove(blogPostId);
}
}
}
}
private void AddComment(List<string> commentsTrack)
{
if (commentsTrack == null || !commentsTrack.Contains(blogPostId))
{
string comment = this.ValidateCommentInput(this.textBoxComment.Text);
if (comment != null)
{
this.databaseContext.AddComment(comment);
if (commentsTrack == null)
{
commentsTrack = new List<string>();
}
commentsTrack.Add(blogPostId);
this.Session["commentAdded"] = commentsTrack;
}
}
else
{
// TODO: Inform the user that the comment cannot be submitted
// several times.
}
}
Creo que esto no es un problema, ya que él está refrescando la página en el navegador. –
@Muhammad Akhtar: sí, gracias, he entendido mal la pregunta. La respuesta ahora está editada. –
Solo un pensamiento. ¿Qué pasa si lo redirigimos a la misma página? enfoque aceptado o no? – Malik
Usted puede, si tiene algún punto en su mente, hacer que la página se actualizará automáticamente después de enviar el formulario, volver a cargar la página de la eliminación de todo el texto de los cuadros de texto, etc. Esto se hace añadiendo el siguiente código ->Page.Redirect(Request.RawUrl);
en la parte inferior de su método de envío.
por ejemplo: si hace clic en el botón 'sistema' detectará el evento 'button_click'. si actualiza la página, el sistema volverá a ejecutar el mismo evento. a don t tiene este problema, en su caso inserción: en su caso
private void button_click(object sender, System.EventArgs e)
{
button.Enabled =false;
button.Enabled =true;
}
es lo que quería decir?
Al igual que con su otra copia de esta respuesta, de esto no se trata la pregunta. –
Estaba recibiendo el mismo problema y lo resolví por rastreo de sesión. Y creo que es fácil y menos tiempo consumiendo manera de resolver este problema.
- 1. Activar la acción predeterminada de un evento
- 2. ¿Cómo mantener la actualización de la página periódicamente mientras el usuario está fuera de la página? y no actualizar si está en la página
- 3. ¿Es posible activar el evento onbeforeunload programmatically?
- 4. Control deslizante de TkInter: cómo activar el evento solo cuando la iteración está completa?
- 5. Volviendo a la línea anterior con Vim
- 6. Volviendo a la fiesta de administración
- 7. Jasmine no puede activar el evento click
- 8. Gestionar evento de página de actualización con javascript
- 9. Evento de la galería a "cuando la imagen está centrada"
- 10. Auto actualización de la página web
- 11. Activar un evento con el Prototipo
- 12. Actualización de la página después de la descarga de archivos
- 13. fábrica de C#: ¿está pendiente la actualización?
- 14. freopen: volviendo a la secuencia original
- 15. MsDeploy está volviendo 403 prohibido
- 16. Evento de Javascript en la página postback
- 17. ¿Está probando una actualización de adb, frente a la instalación?
- 18. Diferencia entre la actualización de la página y la devolución de la página
- 19. Javascript: ¿Capture el evento de la rueda del mouse y no se desplace por la página?
- 20. Volviendo a una entrada de pushState que utilizó ajax
- 21. jQuery Mobile después de la página se muestra el evento
- 22. Cambiar hash sin activar un evento hashchange
- 23. Desea activar el evento desplegable SelectedIndexChanged en Javascript
- 24. Jquery Mobile - Detectar actualización de página - Volver a la página de inicio
- 25. ¿Por qué mi página @ enableviewstate no está sobre el EnableViewsate de la página en el web.config?
- 26. ¿Cómo obtener la hoja de trabajo y la celda a la que la función VBA actual está volviendo?
- 27. Safari saltando/saltando (¿error?) En el primer evento de "enfoque" de la carga de la página
- 28. Actualización del paquete Nuget local en el evento posterior a la construcción
- 29. Cómo llamar a la segunda instancia de jQuery.ajax sobre el éxito de la primera y la página de actualización
- 30. CDI/Weld: ¿cómo gestionar la actualización de la página del navegador después de finalizar la conversación?
¿Está refrescando la página presionando F5 en el navegador? –
sí y cuando lo hago, el evento disparado anteriormente se dispara de nuevo – Paras