<% if(Eval("SaveDate") != DBNull.Value){ %>
do magic
<%} %>
gives me error: Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
I could write : <%# Eval(“SaveDate”) != DBNull.Value ? do magic
But I need to do lots of html magic in if statement.
I know I should add # in order to use Eval, but not sure about correct syntax.
One solution is to wrap the content in a runat=”server” tag with a Visible value, e.g.,
divcan be any HTML tag, but<asp:Panel>and<asp:PlaceHolder>could also be used. Note that “do magic” is still databound, so it’s not a perfect solution if it contains expensive code or code that could generate an error ifEval("SaveDate") == DBNull.Value.Note that
Visible="false"will omit the tag and all its contents from the generated HTML, this means that it is very different fromstyle="display:none"orstyle="visible:hidden", so don’t worry about that.But, if your “do magic” is reasonably complex, another rather simple solution (a bit of a hack) is: use a Repeater (or FormView) with its DataSource set to an array of one item (visible) or no items (hidden):
The actual contents of the datasource array is either empty (hidden) or the element you were already binding to. This makes sure you can still call
<%# Eval(...) %>inside the ItemTemplate.With this approach, your “do magic” is a template which will only be executed if DataSource has one or more items. Which is taken care of by
ElementIfTrue. It’s a bit of a mind bender, but it can save you every once in a while.As a side note: packing your “do magic” in a user control can also keep the complexity down. You don’t really need to change a thing in your HTML/ASP.NET tag mix (
<%# Eval("...") %>still works even inside a user control).