当绑定值包含冒号时,如何绑定GridView HyperLinkField的URL?

时间:2011-06-30 18:52:47

标签: asp.net gridview hyperlink webforms

我正在尝试绑定GridView HyperLinkField,以便将绑定列用作URL中的参数值。非常标准的东西 - 没什么特别的,但是当绑定列包含冒号时绑定失败,即:。我是我的特例,这个值是一个表示持续时间的字符串,例如“14:35”,或“1:07:19”。

这是我的GridView,时间值绑定到HyperLinkField网址。

<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 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

哇,非常奇怪,更糟糕的是,作为最后一步,你可以随时使用RowDataBound,并将单元格文本设置为自己超链接HTML,但在此期间,尝试点击RowDataBound并检查结果。也许你可以在绑定时对值进行编码,这样如果出现问题:编码可能会解决它吗?

您可能还想将其作为错误提交给connect.microsoft.com ...

HTH。