如何在 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 样式可以通过使用 <ItemStyle>
标记来实现,如下所示:
<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("<br />", "<br />");
您可能需要扩展替换以包含更多 br
类型,例如 <br>
、<br/>
、<BR>
等。
【讨论】:
以上是关于如何在 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