learningtech
learningtech

Reputation: 33683

asp:hyperlink href won't show up even though i populate navigateurl

Does anyone know what is wrong with the following two lines of code? In both cases, there is no href in the anchor links when i view it in the browser:

<asp:HyperLink runat="server" NavigateUrl='<%# Eval(Request.QueryString["conferenceId"], "~/Cms/schedule-edit.aspx?conferenceId={0}&type=workshopStream") %>' Text="Create Workshop Stream"></asp:HyperLink>

<asp:HyperLink runat="server" NavigateUrl='<%# String.Format("~/Cms/schedule-edit.aspx?conferenceId={0}&type=scheduleItem", Request.QueryString["conferenceId"]) %>' Text="Create Schedule Item"></asp:HyperLink>

This exact same code seems to work fine when I put it into the ItemTemplate of a Listview though. But it doesn't work when used on it's own in an aspx file.

What's wrong with it?

Also if i replace the navigateUrl with a hardcoded string ~/cms/schedule-edit.aspx?conferenceId=2&type=stuff then the href shows up. It just doesn't work when i have the Eval or String.Format in there.

Upvotes: 3

Views: 2106

Answers (3)

stackh34p
stackh34p

Reputation: 8999

You are using a data-binding expression here. This is denoted in the following syntax:

 <%# [code]  %>

The code inside is evaluated only when the containing control, or any of its ancestors have their .DataBind() method called.

To work this around, you can:

  • Call Page.DataBind()
    This could have some unwanted consequences if you have other data-bound controls on the page, as this method will cause all of them to have their data-binding events fired. Usually, this approach is applied if you have minimalistic code-behind and the entire page relies on data-binding expressions.

  • Give each HyperLink an ID and call HyperLinkID.DataBind();

  • Stick to the approach in codingstill's answer by setting the NavigateUrl property in the code behind of your page/user control.

Upvotes: 2

Win
Win

Reputation: 62260

If those HyperLink server controls are located outside of DataBound controls like GridView, there are two problems in our code -

  1. You want to use <%= %> instead of <%# %> which is used in DataBound controls.
  2. You cannot use <%= %> to set property of a server control. Basically, you cannot mix runat="server" with <%= %>.

Solution

<a href='<%= String.Format("~/Cms/schedule-edit.aspx?conferenceId={0}&type=scheduleItem", 
    Request.QueryString["conferenceId"]) %>'>Create Workshop Stream</a>

Upvotes: 4

Tasos K.
Tasos K.

Reputation: 8079

The anchor syntax NavigateUrl='<%#...%> is only valid inside a GridView, ListView, etc. When it is not inside such controls, you can set its NavigateUrl property via code. Obviously, you also need to give an ID to your HyperLink.

The markup:

<asp:HyperLink ID="HyperLink1" runat="server" Text="Create Schedule Item"></asp:HyperLink>

The code behind:

HyperLink1.NavigateUrl = String.Format("~/Cms/schedule-edit.aspx?conferenceId={0}&type=scheduleItem", Request.QueryString["conferenceId"])

Upvotes: 2

Related Questions