2009-02-09 13 views
8

Poniższa daje mi błąd „Znacznik serwer nie jest dobrze uformowane”tag Server w OnClientClick

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

(ten jest używany w danych związany ListView, który wyświetla listę użytkowników. Po kliknięciu przycisk usuwania Okno dialogowe potwierdzenia JavaScript jest używane do zapytania, czy jesteś tego pewien)

Jak zatem osadzić znacznik serwera w łańcuchu, który zawiera JavaScript?

Odpowiedz

17

Problem dotyczy modelu użytkowego i użycia cudzysłowów pojedynczych i podwójnych.

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

Następnie na kodzie z opóźnieniem dodać funkcję ...

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 

Gdy bryłka wiążący służy jako wartość atrybutu, będziesz pamiętać trzeba użyć apostrofów. Twój skrypt potrzebował również cytatów dla parametru wbudowanego ciągu do funkcji potwierdzenia. W zasadzie zabrakło Ci ofert.

+0

Zauważ, że CreateConfirmation (Eval ("Username")) powinno być napisane CreateConfirmation ((string) Eval ("Username")) (Używam C# ... może to być VB.NET automatycznie rzuca obiekt zwrócony z Eval) –

+0

Jeśli używasz C#, możesz po prostu uczynić obiekt typu Parametr 'Username' przeciwstawny do napisu i nie będziesz potrzebował obsady – John

+0

BlackMael, Oszczędziłeś mi dużo czasu , dzięki ! – Tony

0

Możesz dodać zdarzenie onclick w czasie wykonywania tak:

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


+0

Jeśli masz zdarzenie po stronie serwera dla tego przycisku, wierzę, że ta strategia spowoduje dwukrotne dodanie elementu "onclick" do elementu HTML, powodując nieoczekiwane zachowanie. –

+0

Nie, nie będzie dodawać. Zdarzenie po stronie serwera będzie miało pewne wywołanie __dpPostBack .... Możesz dodać atrybut i wyświetlić źródło strony. –

+0

Niestety nie mogę tego zrobić - ponieważ ta kontrola jest częścią listy danych ListView –

3

Dodaj kod dynamicznie w przypadku ItemDataBound do kontroli ListView.

W zdarzenia Page_Load dodaj następujący

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

Następnie w ItemDataBound obsługi zdarzeń dodać

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

Rozwiązanie to powinno działać, czy używasz OnClientClick lub roztwór Sachin Gaur użytkownika.

+0

Niestety nie mogę tego zrobić - ponieważ ta kontrola jest częścią zestawu danych ListView –

+0

@Richard E - Jeśli dobrze rozumiem, to powinien być w twoim parametrze "e". –

+1

@Richard E-Dostosowałem odpowiedź, aby pomóc Ci znaleźć przycisk. Myślę, że zasługujemy na to, aby nasze głosowanie w dół zostało usunięte. Dzięki. –

7

Znalazłem odpowiedź na co www.asp.net

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

Stawia wszystko w znacznikach więc każdy robi konserwację później nie grzebać znaleźć wszystkie kawałki.

+2

To jest prawie poprawne. Albo OnClientClick = '<% # Eval ("ProductName", @ "return confirm (" "Usuń produkt {0}?" ")")%>' Lub OnClientClick = '<% # Eval ("ProductName", "return potwierdź (\ "Usuń produkt {0}? \") ")%>" pracował dla mnie; zasadniczo najbardziej wewnętrzną podwójną kwotą jest podwójny cudzysłów w łańcuchu C# i należy go odpowiednio wymazać. – Kit