Wednesday, July 22, 2009

Data Binding Expressions and Their Symbols

All data Binding Expressions are evaluated at runtime. There are three ways I know to include data binding expressions in ASP.NET. I don't find that Microsoft has defined any specific terms to distinguish them. For clarify and easy discussion, I would define ones here so that I can discuss and compare them.

These three (3) ways data binding expressions are:


Page-Level Data Binding
<%#  ...  %>

Example:

 <%# Request.MapPath("mytext.txt") %>
 <%# GetUserName() %>
 <%# MyAddress %>
 <%# 1 + 2 * 3 %>

The expression will be evaluated when you call DataBind() of the Page class or any other controls that support it such as the GridView, DetailsView, and FormView.  This expression can be applied to a reference to another control's property, a value of an object property, a member variable or a return value of a function. It can be placed anywhere in the ASPX file whenever it fits. For example,

  <title>
    <%# PageTitle %>
  </title>

  <img src="<%# GetImageFile() %>" alt="" />

  <asp:TextBox ID="txtFirstName" 
               runat="server" Text="<%# GetFirstName() %>" />

  <asp:HyperLink ID="lnkExample" 
                 NavigateUrl="<%# Example.Link.Value %>" 
                 Text="Example" runat="server" />

Page-level data binding is very common and easy to use. It also comes with two methods Eval and Bind. Eval provides readonly capability on data while data with Bind is updatable.

 <%# Eval("LastName") %>
 <%# Bind("FirstName") %>

For the detail how to use them, you can read more on your own.

Control-Level Data Binding
<%$  ...  %>

Example:

 <%$ ConnectionStrings:Northwind %>
 <%$ AppSettings:MyVariable %>

The expression will be evaluated when the page is rendered. There is no need to call DataBind(), unlike the page-level.

In addition, control-level data binding cannot be placed anywhere in the page by itself. Instead, it must be wrapped inside a control tag. The result of the expression is used to set that control's property. For example,

  <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>"  ... /%>
where the <%$ and %> is used to extract the custom connection string from web.config.

Currently, there are only two build-in expressions available. One is to extract connection string from the web.config (see the above example) and the other is to extract application settings from web.config.

  <asp:Literal Text="<%$ AppSettings:MyVariable %>"  ... /%>

Although you can always make your own custom expressions through CodeDOM (Code Document Object Model), creating a custom expression to use is not an easy task.

Script-Level Data Binding
<%=  ...  %>

Example:

 <%= Request.MapPath("mytext.txt") %>
 <%= GetUserName() %>
 <%= MyAddress %>
 <%= 1 + 2 * 3 %>
 <%= myClass.Name %>
 <%= myClass.Execute %>

  <script language="javascript">
     location.href = <%= MyForwardPageUrl %>;
     ...
  </script>

Similar to the control-level, the expression will be evaluated when the page is rendered. Then, ASP.NET automatically inserts the value of the expression. There is no need to make any call to any DataBind() method either including Page.DataBind(). Similar to page-level, it can be placed anywhere in the markup page.