Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

eval in if statement?

Tags:

 <% 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.

like image 267
Stewie Griffin Avatar asked Aug 11 '10 19:08

Stewie Griffin


People also ask

Why you shouldn t use eval?

Malicious code : invoking eval can crash a computer. For example: if you use eval server-side and a mischievous user decides to use an infinite loop as their username. Terribly slow : the JavaScript language is designed to use the full gamut of JavaScript types (numbers, functions, objects, etc)… Not just strings!

What eval function do?

The eval() function evaluates JavaScript code represented as a string and returns its completion value. The source is parsed as a script.

What does eval return in JavaScript?

The return value of eval() is the value of last expression evaluated, if it is empty then it will return undefined . Example: eval("console.

What is eval in angular?

The AngularJS $eval method is used to executes the AngularJS expression on the current scope and returns the result. In AngularJS, expressions are similar to JavaScript code snippets that are usually placed in bindings such as {{ expression }}.


1 Answers

One solution is to wrap the content in a runat="server" tag with a Visible value, e.g.,

<div runat="server" Visible='<%# Eval("SaveDate") != DBNull.Value %>'>    do magic </div> 

div can 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 if Eval("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 from style="display:none" or style="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):

<asp:Repeater runat="server" DataSource='<%# ElementIfTrue(Eval("SaveDate") != DBNull.Value) %>'     <ItemTemplate>         do magic     </ItemTemplate> </asp:Repeater>  protected IEnumerable ElementIfTrue(bool condition)  {     if (condition)         return new object[] { Page.GetDataItem() };     else         return new object[0]; } 

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).

like image 197
Ruben Avatar answered Oct 05 '22 13:10

Ruben