为什么我的超链接在 GridView 项模板中无法正常工作 ASP.NET

本文关键字:常工作 工作 NET ASP 超链接 我的 GridView 为什么 | 更新日期: 2023-09-27 18:31:08

在我的GridView里,我有这个:

<asp:TemplateField HeaderText="Issue">
    <ItemTemplate>
        <asp:HyperLink ID="EscalationHyperlink" runat="server" NavigateUrl='<%# EscalationGetNavigateUrl(Eval("ID")) %>' Text='<%# Eval("ID") %>'>
        </asp:HyperLink>
     </ItemTemplate>
</asp:TemplateField>

它不会在生成的GridView中显示超链接。"文本"值是正确的,它只是不是超链接。此GridView嵌入在UpdatePanel中,由用户按下按钮生成。

如果我在里面设置了一个断点EscalationGetNavigateUrl()它会在按下按钮时跳闸,它会返回格式正确的超链接,这很奇怪。

为了使事情更有趣,我到处都有这个确切的标记,它似乎在其他页面上工作正常,只是不是这个页面。

关于我可能出错的地方(或更好的调试方法)的任何想法?就像代码隐藏中生成的值没有以某种方式进入浏览器一样。

代码隐藏如下所示:

protected string EscalationGetNavigateUrl(object field)
{
     return String.Format("~/EscalationDetails.aspx?EscalationId={0}", field);
}

编辑:我已经在下面的评论中说过这一点,但我想添加一些从服务器返回的输出。它看起来像这样:

<a id="MainContent_ClosedCREscGridView_EscalationHyperlink_0">175</a>

您会注意到链接上没有 href。

为什么我的超链接在 GridView 项模板中无法正常工作 ASP.NET

在我面前放着一瓶威士忌和一把上膛的左轮手枪几个小时后,我想出了问题所在。答案如下:

ClosedCREscGridView.Enabled = true;

仅仅让 GridView "可见"是不够的。您还必须使其"启用",HyperLink NavigateURL功能才能在GridView TemplateField内工作。

希望这能在未来为其他人节省一些时间。

由于您正在调用一个方法而不是Eval()此属性,因此您可以尝试:

<%= EscalationGetNavigateUrl(Eval("ID")) %>

这是一种强烈的预感,而不是 100% 这将起作用。

编辑:我花了一段时间才找到它。您正在使用的是数据绑定表达式。您可能需要的是一个显示表达式。

https://support.microsoft.com/kb/976112?wa=wsignin1.0

这是一个奇怪的问题,但您很幸运它适用于其他页面,因为您可以比较工作页面和非工作页面以找到差异。例如,它们是否都使用 DataView?,是否都使用 asp:TemplateField?,它们是否都是通过 updatepanel/回调生成的(而不是首次加载/回发)?等。

其他一些可以尝试的方法:

1) 将不属于更新面板且不在模板/数据视图中的页面添加 asp:HyperLink 控件,并确保其呈现正常。

2)尝试直接使用href属性而不是通过NavigateUrl来强制超链接,例如:

<asp:TemplateField HeaderText="Issue">
    <ItemTemplate>
        <asp:HyperLink ID="EscalationHyperlink" runat="server" href='<%# EscalationGetNavigateUrl(Eval("ID")) %>' Text='<%# Eval("ID") %>'>
        </asp:HyperLink>
     </ItemTemplate>
</asp:TemplateField>

3)如果你真的不需要超链接作为服务器控件(你可能不需要,因为它是动态的),你可以尝试直接呈现HTML如下:

<asp:TemplateField HeaderText="Issue">
    <ItemTemplate>
        <a href='<%# EscalationGetNavigateUrl(Eval("ID")) %>'><%# Eval("ID") %></a>
     </ItemTemplate>
</asp:TemplateField>

诚然,#3 不是一个理想的解决方案,因为它应该可以正常工作,但它可能会为您提供其他结果进行比较,这可能有助于确定此页面上这种不稳定行为的原因。

关于调试:您可以在 DataView 的RowDataBound处理程序中放置一个断点,设置NavigateUrl,然后测试它是否实际设置。如果看起来不错,那么您还可以在某些GetCallbackResultUnload处理程序中存根,在每个处理程序中设置断点,并从这些处理程序中检查NavigateUrl值。