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.

Monday, July 20, 2009

WebpartManager.ConnectWebparts Error

When executing the WebpartManager.ConnectWebparts() statement, I got the following error:

The ConnectWebParts method cannot be called after connections have already been activated (in WebPartManager.PreRender).

This problem occurred because I connected WebParts in Page_PreRender event.
     this.WebPartManager1.ConnectWebParts(provider, providerConnectionPoint,
                                          consumer, consumerConnectionPoint);

Moving it back to Page_Load event, everything works fine.

dbreader and dbwriter

If you have execution permission error when you run your ASP.NET, assigning dbreader and dbwriter roles to the ASPNET user will not help, especially your application only uses stored procedures. dbreader and dbwriter serve no purpose for this. They are related to table access. In this case, you need the following statement (if you're using SQL 2005).

GRANT EXECUTE ON SCHEMEA::dbo TO ASPNET

Why GRANT EXECUTE ON SCHEMEA?

GRANT EXECUTE ON SCHEMEA::dbo TO ASPNET

By default schema is owned by dbo (any member of the sysadmin fixed sever role), which is different from db_owner (fixed database role).

If you don't specify schema on the table when you create it, the schema will be created under dbo privileges. The schema of the default LocalSqlServer database ASPNETDB is usually under dbo. Most of time, you need to run GRANT EXECUTE ON SCHEMEA statement.

What this statement does is to grant ASPNET

  • to execute stored procedures in the dbo schema.

If you change your mind later after you have granted the EXECUTE permission, you can always use REVOKE to remove the previous granted (or denied) permission, e.g.,

REVOKE EXECUTE ON SCHEMEA::dbo TO ASPNET

You can also use DENY statement to prevent someone from having certain permissions.

Can't View CHM Files

Whenever a CHM file is not viewable, I usually can go Properties of that file, click Unblock and then view the file. But this method suddenly doesn't work for me today because there is no Unblock button available.

I found that all the CHM files under that particular directory are not viewable. They were all working fine in the past and I also remember that I unblocked all those files. I am not sure if it is related to my most recent security update last week. The interesting is that, as soon as I copied those CHM files outside that directory, they become all viewable again. It is weird. Those CHM files are not in the network but my local drive. Well, the good thing is that the problem is solved.

In normal situation, see KB902225 to resolve CHM un-viewable issue.

Sunday, July 12, 2009

Verify who is ASP.NET Logon User

Usually I use Request.LogonUserIdentity.Name to check ASP.NET Logon User. It works for all types of users.

      System.Web.HttpContext.Current.User.Identity.Name
or
      Request.ServerVariables["AUTH_USER"]

are only for Windows Authenticated user. For Internet users (anonymous guest), empty string is expected.

Request.LogonUserIdentity.Name will show you if the user is anonymous.