2009-02-09 18 views
8

El siguiente me da un error de "La etiqueta servidor no está bien formado"etiqueta de servidor en la OnClientClick

<asp:LinkButton ID="DeleteButton" runat="server" CommandName="Delete" 
    OnClientClick="return confirm('Are you sure you want to delete <%# Eval("Username") %>?');"> 
    Delete 
</asp:LinkButton> 

(Esto se utiliza en un ListView con destino datos que muestra una lista de usuarios. Al hacer clic en el botón eliminar se usa un diálogo de confirmación de JavaScript para preguntarle si está seguro)

Entonces, ¿cómo puedo incrustar una etiqueta de servidor en una cadena que contiene JavaScript?

Respuesta

17

El problema es el nugget de enlace y el uso de comillas simples y dobles.

<asp:LinkButton D="DeleteButton" runat="server" CommandName="Delete" OnClientClick='<%# CreateConfirmation(Eval("Username")) %>'>Delete</asp:LinkButton> 

Luego, en el código subyacente añadir la función ...

Public Function CreateConfirmation(ByVal Username As String) As String 
    Return String.Format("return confirm('Are you sure you want to delete {0}?');", Username) 
End Function 

Cuando la pepita de unión se utiliza como valor para un atributo, se le nota que tiene que utilizar comillas simples. Su script también necesitaba comillas para el parámetro de cadena incrustado para la función de confirmación. Básicamente se quedó sin comillas.

+0

Tenga en cuenta que CreateConfirmation (Eval ("Nombre de usuario")) debe escribirse CreateConfirmation ((cadena) Eval ("Nombre de usuario")) (Estoy usando C# ... podría ser ese VB.NET arroja automáticamente el objeto devuelto por Eval) –

+0

Si está usando C#, puede hacer que el tipo de parámetro 'Username' se oponga a la cadena, y no necesitaría el molde – John

+0

BlackMael, me ahorró mucho tiempo , Gracias ! – Tony

0

Puedes añadir el evento onclick en tiempo de ejecución, así:

DeleteButton.Attributes.Add("onclick", "'return confirm('Are you sure you want to delete '" + Username); 


+0

Si tiene un evento del lado del servidor para este botón, creo que esta estrategia agregará 'onclick' al elemento HTML dos veces, causando un comportamiento inesperado. –

+0

No, no agregará. Un evento del lado del servidor tendrá alguna llamada __dpPostBack .... Puede agregar el atributo y ver el origen de la página. –

+0

Lamentablemente no puedo hacer esto, ya que este control es parte de un ListView databound –

3

Agregue el código de forma dinámica en el caso ItemDataBound para el control ListView.

En su evento Load, agregue el siguiente

lst.ItemDataBound += new EventHandler<ListViewItemEventArgs>(lst_ItemDataBound); 

Luego, en el controlador de eventos ItemDataBound añadir

Control DeleteButton = e.Item.FindControl("DeleteButton"); 
DeleteButton.OnClientClick = string.Format("return confirm('Are you sure you want to delete '{0}'?", Username); 

Esta solución debería funcionar si se utiliza OnClientClick o solución de Sachin Gaur.

+0

Lamentablemente no puedo hacer esto, ya que este control es parte de un ListView con datos –

+0

@Richard E-Si lo entiendo correctamente, debe estar en su parámetro 'e'. –

+1

@Richard E-He ajustado la respuesta para ayudarlo a encontrar su botón. Creo que nos merecemos que eliminen nuestro voto negativo. Gracias. –

7

que consideran que esta respuesta durante al www.asp.net

OnClientClick='<%# Eval("ProductName", "return confirm(""Delete the Product {0}?"")") %>' 

Esto pone todo en el marcado de modo que nadie haga mantenimiento posterior no tiene cavar alrededor para encontrar todas las piezas.

+2

Esto es casi correcto. Ya sea OnClientClick = '<% # Eval ("ProductName", @ "return confirm (" "¿Eliminar el producto {0}?" ")")%>' O OnClientClick = '<% # Eval ("ProductName", "return" confirmar (\ "¿Eliminar el producto {0}? \") ")%> 'funcionó para mí; básicamente, la comilla doble más interna es una comilla doble en una cadena C# y debe escaparse en consecuencia. – Kit

Cuestiones relacionadas