有谁知道以下两行代码有什么问题?在这两种情况下,当我在浏览器中查看时,锚链接中没有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时,它就无法工作。
答案 0 :(得分:4)
如果 HyperLink 服务器控件位于 DataBound 控件之外,如GridView,则代码中存在两个问题 -
<%= %>
代替DataBound控件中使用的<%# %>
。<%= %>
设置服务器控件的属性。基本上,您不能将runat="server"
与<%= %>
混合。<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中的方法。