Problem with ImageButton.OnClientClick when DataBinding

  • Thread starter Thread starter Nathan Sokalski
  • Start date Start date
N

Nathan Sokalski

I have the following tag in one of my DataList's ItemTemplates:

<asp:ImageButton ID="btnViewQuestion" runat="server" BorderWidth="0"
ImageUrl="images/qmark.gif" Height="27px" Width="26px"
OnClientClick="window.open(<%#
DataBinder.Eval(Container.DataItem,"questionid","'viewquestion.aspx?questionid={0}'")
%>,'question','scrollbars=yes,width=630,height=480,location=no,menubar=no,status=no,toolbar=no');"/>

As you can see, my goal is to use the value from the DataBinding Expression
as the first parameter of a JavaScript window.open() method in the
OnClientClick property of an ImageButton. However, when I run the
application using this, I recieve the following error:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Parser Error
Description: An error occurred during the parsing of a resource required to
service this request. Please review the following specific parse error
details and modify your source file appropriately.

Parser Error Message: The server tag is not well formed.


I tried to be careful using the single and double quotes, but I think
everything is correct. Did I do something wrong in this server tag? All my
other DataBinding Expressions work fine when I remove this tag, and the
error says the problem is in this line, so what's the problem? Thanks.
 
OnClientClick isn't a bindable property.
you should build OnClientClick string in ImageButton's load event.
Hope this will help.
 
I agree that its most flexible to do in code, but OnClientClixk can be
databound

<asp:DataGrid ID="DataGrid1" runat="server" GridLines="Both"
BorderWidth="0" AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:Button ID="Button1" runat="server"
OnClientClick='<%# "alert(""" & Cstr(Container.DataItem) & """);return
false;" %>' />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Load
Dim ints As New List(Of Integer)
ints.Add(1)
ints.Add(2)
ints.Add(3)

DataGrid1.DataSource = ints
DataGrid1.DataBind()
End Sub

This would alert the integer value on Button click
 
To add, the trick is that the databinding expression should span the entire
property e.g "cover" it. That way it works. However, complex kind of script
is best to build in code. With a helper function for example.
 
Back
Top