【问题标题】:How to bind the URL of a GridView HyperLinkField when the bound value contains a colon?绑定值包含冒号时如何绑定GridView HyperLinkField的URL?
【发布时间】:2011-09-26 05:58:30
【问题描述】:

我正在尝试绑定一个 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。注意&lt;a&gt; 标签没有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 需要采用该格式的参数值,并且它已经编写、测试和使用。

【问题讨论】:

    标签: asp.net gridview hyperlink webforms


    【解决方案1】:
    <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 使用 LinkBut​​ton 或 ImageButton,为 ItemCommand 事件附加一个处理程序,然后在其中包含第二个网格的 UpdatePanel。事件处理程序代码用于绑定此网格的数据源。
    • 我不确定更新面板是什么意思。当前字段是一个简单的 Boundfield,用于在 gridview 中显示名称。因此,如果我要使用链接按钮,我将不得不找到一种方法将链接按钮上的数据库数据显示为文本或某事。也许你可以发布一个答案here.我会搜索并尝试你的建议。
    【解决方案2】:

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

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

    HTH。

    【讨论】:

    • 谢谢,@Brian,我会试一试。我怀疑这与冒号被用作DataNavigateUrlFormatString 中的值占位符的一部分有关,例如如果我有要格式化的货币值,我可能会在格式字符串中使用 {0:C} 而不仅仅是 {0}。
    • 是的,这可能是有道理的,但我认为这只有在您拥有 {} 时才适用,但谁知道..
    猜你喜欢
    • 2016-02-06
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多