asp:超链接href即使我填充navurl也不会显示

时间:2014-01-02 14:56:02

标签: asp.net hyperlink

有谁知道以下两行代码有什么问题?在这两种情况下,当我在浏览器中查看时,锚链接中没有href:

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

当我将它放入Listview的ItemTemplate时,这个完全相同的代码似乎工作正常。但是当它在aspx文件中使用时它不起作用。

它出了什么问题?

此外,如果我用一个硬编码字符串~/cms/schedule-edit.aspx?conferenceId=2&type=stuff替换navigateUrl,那么href会显示出来。当我在那里有Eval或String.Format时,它就无法工作。

3 个答案:

答案 0 :(得分:4)

如果 HyperLink 服务器控件位于 DataBound 控件之外,如GridView,则代码中存在两个问题 -

  1. 您希望使用<%= %>代替DataBound控件中使用的<%# %>
  2. 您无法使用<%= %>设置服务器控件的属性。基本上,您不能将runat="server"<%= %>混合。
  3. 解决方案

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

答案 1 :(得分:2)

锚语法NavigateUrl='<%#...%>仅在GridView,ListView等内部有效。当它不在此类控件内时,您可以通过代码设置其NavigateUrl属性。显然,您还需要为HyperLink提供ID。

标记:

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

背后的代码:

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

答案 2 :(得分:2)

您在此处使用数据绑定表达式。这用以下语法表示:

 <%# [code]  %>

仅当包含控件或其任何祖先的.DataBind()方法被调用时,才会评估内部代码。

要解决这个问题,你可以:

  • 致电Page.DataBind()
    如果页面上有其他数据绑定控件,则可能会产生一些不良后果,因为此方法会导致所有控件都触发数据绑定事件。通常,如果您具有简约的代码隐藏并且整个页面依赖于数据绑定表达式,则应用此方法。

  • 给每个HyperLink ID并致电HyperLinkID.DataBind();

  • 通过在页面/用户控件后面的代码中设置NavigateUrl属性,坚持codingstill's answer中的方法。