如何在GridView的HyperLinkField中绑定包含冒号的URL?

6
我正在尝试绑定一个GridView HyperLinkField,使得绑定的列作为URL中的参数值。这是相当标准的操作 - 没有什么花哨的东西,但是当绑定的列包含冒号:时,绑定会失败。在我特定的情况下,这个值是表示时间长度的字符串,例如"14:35"或"1:07:19"。
以下是我的GridView,将时间值绑定到HyperLinkField url中。
<asp:GridView ID="ResultsGridView" runat="server" AutoGenerateColumns="False" 
    DataSourceID="ResultsDataSource" EnableModelValidation="True" 
        AllowPaging="True">
    <Columns>
        <asp:BoundField DataField="Year" HeaderText="Year" SortExpression="Year" />
        <asp:HyperLinkField DataNavigateUrlFields="RunTime" 
            DataTextField="RunTime" HeaderText="Hyperlink" 
            DataNavigateUrlFormatString="LinkedPage.aspx?param={0}" />
        <asp:BoundField DataField="RunTime" HeaderText="Time" 
            SortExpression="RunTime" />
        <asp:BoundField DataField="FullName" HeaderText="Name" 
            SortExpression="FullName" ReadOnly="True" />
    </Columns>
</asp:GridView>

它生成的HTML如下所示。请注意,<a>标签没有href属性。
<tr>
    <td>2010</td><td><a>34:58</a></td><td>34:58</td><td>Joe Schmoe</td>
</tr><tr>
    <td>2010</td><td><a>35:30</a></td><td>35:30</td><td>Rod Krueger</td>
</tr><tr>
    <td>2010</td><td><a>35:38</a></td><td>35:38</td><td>Mike Johnson</td>
</tr>

但是,如果我将绑定字段从RunTime切换到Year,即切换到不包含冒号值的列,则它会如预期般工作。以上的GridView,将HyperLinkField的DataNavigateUrlFields属性更改如下:

    <asp:HyperLinkField DataNavigateUrlFields="Year" 
        DataTextField="RunTime" HeaderText="Hyperlink" 
        DataNavigateUrlFormatString="LinkedPage.aspx?param={0}" />

现在HTML输出是正确的,如下:

<tr>
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">34:58</a></td><td>34:58</td><td>Joe Schmoe</td>
</tr><tr>
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">35:30</a></td><td>35:30</td><td>Rod Krueger</td>
</tr><tr>
    <td>2010</td><td><a href="LinkedPage.aspx?param=2010">35:38</a></td><td>35:38</td><td>Mike Johnson</td>
</tr><tr>

我的问题核心是:如何将包含冒号的值与HyperLinkField的URL绑定到数据列?或者,如果失败,是否可以通过其他方法创建相同的绑定超链接?
更改数据格式以不包括冒号将是最后的选择,因为LinkedPage.aspx期望参数值采用该格式,并且已经编写、测试和使用。
2个回答

8
<asp:TemplateField HeaderText="Hyperlink">
        <ItemTemplate>
            <asp:HyperLink ID="HyperLink1" runat="server" 
                NavigateUrl='<%# Eval("RunTime", @"LinkedPage.aspx?param={0:hh\:mm}") %>' 
                Text='<%# Eval("RunTime", @"{0:hh\:mm}") %>'></asp:HyperLink>
        </ItemTemplate>
    </asp:TemplateField>

这个超链接怎样才能被用来在同一页中加载第二个网格视图? - aspiring
1
@aspiring 使用 LinkButton 或 ImageButton,附加一个 ItemCommand 事件处理程序,然后使用 UpdatePanel 包含第二个网格。事件处理程序代码用于绑定此网格的数据源。 - Adrian Iftode
我不确定你所说的更新面板是什么意思。当前字段是一个简单的 Boundfield,用于在 gridview 中显示名称。因此,如果我要使用 LinkButton,我必须找到一种方法将数据库数据显示在 LinkButton 上作为文本或其他方式。也许你可以在这里发布一个答案,我会搜索并尝试你的建议。 - aspiring

1

哇,非常奇怪,最坏的情况下,作为最后一步,您总是可以利用RowDataBound,并将单元格文本设置为超链接HTML,但同时,请尝试进入RowDataBound并在那里检查结果。也许您可以在绑定时对值进行编码,这样如果有:的问题,编码可能会解决它?

您还可以将其提交为connect.microsoft.com上的错误...

希望对您有所帮助。


谢谢,@Brian,我会尝试一下。我猜测这可能与在“DataNavigateUrlFormatString”中使用冒号作为值占位符有关,例如,如果要格式化货币值,我可能会在格式字符串中使用{0:C}而不仅仅是{0}。 - Matt
是的,这可能有道理,但我认为这只适用于你有 {} 的情况下,谁知道呢。 - Brian Mains

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接