2008-12-12 16 views
9

Supongamos que tiene algo así como ASP ASP.NET: DetailsView para mostrar y editar un solo registro en una base de datos.¿Hay alguna forma nativa en ASP.NET para hacer un "mensaje de éxito"?

Es simple registrar los casos de error ... agrega la validación y un resumen de validación. Cuando su formulario de actualización falla la validación, naturalmente hace ruido: muestra el mensaje de validación y/o el resumen de validación. No se requiere un solo código detrás.

Pero luego, pasa la validación, y hace su actualización completamente en silencio. No tiene sentido que haya sucedido algo, y no parece haber ninguna configuración predeterminada para hacer un mensaje de éxito sin código subyacente.

Pero incluso los códigos subyacentes son confusos. ¿Qué evento debe mostrar el mensaje de éxito? onItemUpdate, ¿verdad? Bien, pero supongamos que haces otro cambio y obtienes un error de validación. Tu mensaje de éxito se queda. No pude encontrar un evento que desactive de manera confiable un mensaje de éxito existente si hubo un error de validación.

¡Esto debería ser un desarrollo web 101! Porqué es tan dificil?

EDIT:

Alguien sugirió utilizar el evento ItemCommand ... He intentado esto y muchos otros eventos, pero que el mensaje de éxito simplemente no va a desaparecer. Aquí hay un código.

Mi mensaje en ASP.NET

<label id="successMessage" class="successMessage" runat="server"></label> 

Y mi etiqueta DataView (simplificado):

<asp:DetailsView 
     Id="EditClient" 
     DataKeyNames="LicenseID" 
    DataSourceID="MySource" 
    runat="server" 
     OnItemUpdated="SuccessfulClientUpdate" 
     OnItemCommand="ClearMessages"> 

Y, mi código subyacente:

protected void SuccessfulClientUpdate(object sender, DetailsViewUpdatedEventArgs e) 
{ 
    successMessage.InnerText = string.Format("Your changes were saved."); 
    successMessage.Visible = true; 
} 

protected void ClearMessages(object sender, DetailsViewCommandEventArgs e) 
{ 
    successMessage.InnerText = string.Empty; 
    successMessage.Visible = false; 
} 

Una vez que haga una actualización exitosa, sin embargo, nada parece hacer desaparecer ese mensaje, ni siquiera la validación fallida.

segundo EDIT:

sólo quiero ser claro que lo hice trate de poner el código ClearMessages en Load. Sin embargo, nada parece hacer que la etiqueta successMessage desaparezca cuando pulso actualizar una segunda vez CON un error de validación. ¿Alguien puede sugerir algún otro consejo para la resolución de problemas?

Respuesta

7

Por lo que yo sé, no hay forma nativa de hacer esto. Usted puede despotricar, tal vez Microsoft lo escuche :).

Restablecer el "mensaje de éxito" en Page_Load, o en cualquier parte del código subyacente, no funcionará. Esto se debe a que la validación de ASP.NET normalmente se realiza tanto en el lado del cliente como en el del servidor. Esto significa que para cada control de validación que pones en la página, ASP.NET genera algún Javascript del lado del cliente que realiza la validación y representa el error en el cliente, sin volviendo al servidor. Así que estás atascado con el mensaje de éxito y el mensaje de error al mismo tiempo.

Lo que puede hacer al respecto:

  • lugar un control <div> en su página, que aparecería el mensaje de éxito (como ya se ha sugerido por otros más arriba). Cada vez que actualice algo (en el código del lado del servidor), muestre el control y configure un "¡Correcto!" Significativo. mensaje de texto.
  • registre una función de JavaScript personalizada que buscaría el <div> y ocultarlo en cada página de envío. Tenga en cuenta que la función debe invocarse antes del script de cliente autogenerado que realiza la validación.

Si nos fijamos en la fuente del cliente de una página ASP.NET (con validadores en él), esto es lo que puede encontrar:

<form name="aspnetForm" method="post" action="MyPage.aspx" onsubmit="javascript:return WebForm_OnSubmit();id="aspnetForm">

El WebForm_OnSubmit es generado por ASP.NET y llama al javascript que hace la validación. Muestra:

function WebForm_OnSubmit() { 
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) 
    return false; 
return true; 
} 

para registrar su código personalizado que oculta el mensaje de éxito, debe colocar (en su código subyacente) algo como lo siguiente:

if (!Page.ClientScript.IsOnSubmitStatementRegistered("ClearMessage")) 
{ 
    string script = @"document.getElementById('" + 
     yourDivControl.ClientID + "').style.display='none'"; 
    Page.ClientScript.RegisterOnSubmitStatement(Page.GetType(), "ClearMessage", script); 
} 

Esto a su vez WebForm_OnSubmit autogenerado de su página en lo siguiente:

function WebForm_OnSubmit() { 
    document.getElementById('ctl00_yourDivControl').style.display='none'; 
    if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) 
     return false; 
    return true; 
} 

el efecto: En cada devolución de datos (por ejemplo, cuando se activa ItemCommand, o cuando se hace clic en algún botón Guardar, o anyt hing else), aparecerá el control div con el mensaje "éxito". En la siguiente devolución de datos, justo antes de enviar la página al servidor, este mensaje se borra. Por supuesto, si esta devolución de datos también desencadena un "éxito", el mensaje se muestra nuevamente por el código subyacente en el servidor. Y así sucesivamente y así sucesivamente.

Espero que lo anterior sea útil. No es la solución completa, pero da suficientes pistas para orientarlo en la dirección correcta.

+0

Santa mierda, esa es una realidad poco realista de lo que jamás hubiera imaginado, pero una respuesta fantástica. Supongo que también podría forzar la validación para volver al servidor cada vez. Eres un campeón. – danieltalsky

+0

Otra sugerencia que podría ser útil: puedes hacer todo lo anterior en tu página maestra (suponiendo que uses ASP.NET 2.0). Es decir, puede colocar el control div justo encima del contenido y mostrar los mensajes de información allí (continuación ...) –

+0

Expone un método público SetMessage() en el objeto derivado de MasterPage y obtiene el soporte de "mensaje de información" para todas las páginas que usan esta página maestra, usando '((MyMaster) Page.Master) .SetMessage (" Success ")'; –

1

Utilice el evento ItemCommand y realice el restablecimiento al estado de limpieza para cada comando que se le dé. Luego, si la validación falla en la actualización, se mostrará el error de validación. Si tiene éxito, mostrará el mensaje de éxito. Posteriormente, los clics de botón invocarán el evento ItemCommand y puede reiniciarlo nuevamente para comenzar de nuevo.

+0

Intenté esto, pero parece que en realidad no hace invisible la etiqueta en un segundo intento de edición que desencadena una falla de validación. – danieltalsky

+0

¿Ha habilitado la validación del lado del cliente? Si es así, deberá ocultar el mensaje de éxito con javascript. – tvanfosson

0

Por qué no desactivar el mensaje de validación en Page_Load. Supongo que si se produce una publicación posterior, querría deshacerse del mensaje, así que asegúrese de que siempre esté desactivado. O deshabilite el estado de vista para el control estableciendo EnableViewState = "False" en el marcado (página aspx).

Así:

protected void ClearMessages(object sender, DetailsViewCommandEventArgs e) 
{ 
    successMessage.InnerText = string.Empty;  
    successMessage.Visible = false; 
} 

se convierte en:

protected void Page_Load(object sender, EventArgs e) 
{ 
    successMessage.InnerText = string.Empty;  
    successMessage.Visible = false; 

} 

también como nota al margen si buiding.sitios netos que necesita para obtener comftorble con código detrás de mí en mi humilde opinión :-)

+0

Me siento completamente cómodo con los códigos subyacentes, pero esta es una aplicación web muy simple, y tomé la decisión de diseñar todo lo que podía usando etiquetas ASP.NET nativas. Es encantador, y sinceramente, no he tenido que escribir ni un ápice de código antes de esto. – danieltalsky

+0

Y, por desgracia, eso no hace el trabajo. Cuando disparo mi mensaje de validación, el mensaje de éxito permanece. Incluso intenté desactivar EnableViewState. – danieltalsky

1

Daniel, necesitaba algo similar, así que me derivé de una etiqueta y la vinculé directamente a los eventos planteados por los diversos derivados de DataSourceControl (LinqDataSource, ObjectDataSource, SqlDataSource). También usé el JavaScript del lado del cliente para ocultar la etiqueta durante la validación y/o el envío del formulario (como la respuesta de Dan.C.)

El control expone propiedades de texto de mensaje separadas para eventos eliminados, insertados y actualizados correctamente.

He publicado la fuente comentado para la solución a http://codehq.net/files/UpdateSuccessMessage.zip

Espero que esto ayude.

+0

Gracias por su respuesta. Estoy descargando el código y revisándolo. Todavía nunca terminé implementando algo, pero mis usuarios están empezando a pedir esto. Estaba planeando algún tipo de solución "fadeout" de jQuery, pero estoy revisando la tuya. – danieltalsky

Cuestiones relacionadas