如何在 asp GridView BoundField 中正确显示换行符而不关闭 HTML 编码

Posted

技术标签:

【中文标题】如何在 asp GridView BoundField 中正确显示换行符而不关闭 HTML 编码【英文标题】:How to properly display line breaks in asp GridView BoundField without turning HTML encoding off 【发布时间】:2017-11-12 00:29:06 【问题描述】:

我需要在asp GridView 中的asp BoundField 的内容中显示换行符。我最初有\r\n,但页面完全忽略了这个换行符。我做的第二件事是用字符串中的换行符替换我的换行符,但是页面只显示文字文本“”,无论我在字符串中的哪个位置。我尝试的最后一件事在技术上有效,我通过将我的字符串放入字段中,并将元素的 html 编码设置为“false”来实现这一点。我对这个解决方案的问题是我听说这会引起安全问题。如何在不将 HTML 编码设置为 false 的情况下在这些字段中设置换行符。

【问题讨论】:

html 中的换行符是<br/>,而不是\r\n 但我的网站将其显示为“”而不是中断,除非我有 HTML encode=false 你能显示来自 GridView 的代码吗? 【参考方案1】:

这个问题特别提到了绑定字段,但是,我对 gridview 模板字段有类似的需求,我发现使用:

        style="white-space: pre-wrap;"

...为我需要的东西工作(并且该选项也可能对绑定字段有所帮助)。 例如

            <asp:TemplateField HeaderText="Message" SortExpression="CommittedMessage">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox7" runat="server" 
                        Text='<%# Bind("CommittedMessage") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" 
                        ForeColor='<%# System.Drawing.Color.FromName(Eval("WarningForeColour").ToString()) %>'
                        style="white-space: pre-wrap;"
                        Text='<%# Bind("CommittedMessage") %>'></asp:Label>
                </ItemTemplate>
                <ItemStyle Font-Names="9px" HorizontalAlign="Left" />
            </asp:TemplateField>

【讨论】:

【参考方案2】:

默认情况下,HTML 将换行符、制表符和空格视为常见的空格,并将多个空格字符折叠到一个空格中以进行渲染。因此,在 HTML 中包含换行符通常不会影响文本在浏览器中的呈现方式。有关此主题的更多信息和背景信息,请参阅之前的 question,其中包含一些非常有用的 cmets。

但是,如果您希望文本中的换行符在浏览器中呈现为换行符,您可以在纯 CSS 中实现此目的,而无需关闭 HTML 编码或引入任何安全问题。 white-space CSS property 是标准的,长期以来被所有主流浏览器支持,并且可以让您指示浏览器按原样呈现换行符。

更改由 ASP.Net GridView 生成的 HTML 以包含 CSS 样式可以通过使用 &lt;ItemStyle&gt; 标记来实现,如下所示:

<style>
    .preformatted 
    
        white-space: pre-line;
    
</style>

<asp:GridView runat="server" ...>
    <Columns>
        <asp:BoundField ...>
            <ItemStyle CssClass="preformatted"/>
        </asp:BoundField>
    </Columns>
</asp:GridView>

您也可以尝试使用white-space: pre;,而不是使用white-space: pre-line;,但这会剥夺浏览器流动文本以适应可用空间的能力,因此如果您的文本不包含,可能会导致您的网格列变得太宽足够的换行符。

【讨论】:

这确实有效。在我接受您的回答之前,您能解释一下为什么会这样吗?为什么没有这个就行不通?我已经尝试过其他类型的换行符 () 那么为什么 aspx 需要这个额外的指令来执行它默认应该执行的操作? 嗨@adam,这是一个好点。我已经修改了我的答案,以包含指向涉及空白处理的特定问题的链接。【参考方案3】:

您可以在 GridView 的 RowDataBound 事件中进行搜索和替换。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

    //check if the row is a datarow
    if (e.Row.RowType == DataControlRowType.DataRow)
    
        //find the boundfield cell
        string cellValue = e.Row.Cells[0].Text;

        //replace the encoded <br> with a real one and put the string back
        e.Row.Cells[0].Text = cellValue.Replace("&lt;br /&gt;", "<br />");
    

您可能需要扩展替换以包含更多 br 类型,例如 &lt;br&gt;&lt;br/&gt;&lt;BR&gt; 等。

【讨论】:

以上是关于如何在 asp GridView BoundField 中正确显示换行符而不关闭 HTML 编码的主要内容,如果未能解决你的问题,请参考以下文章

ASP中 devexpress 的gridview如何让数据加载时就排序

如何在 ASP.Net Gridview 中添加“确认删除”选项?

如何在 ASP.NET MVC 视图中用 C# 打印出 GridView?

如何使用 asp.net 在 gridview 中突出显示搜索结果?

如何在 c# ASP.net 中从 GridView 行进行单按钮照片上传

如何使用 asp.net 将 gridview 图像和数据导出到 PDF 或使用 asp.net 将 gridview 数据导出到 PDF