Replace(Environment.NewLine, "<br/>") 在网页上显示文本时未按预期工作
Posted
技术标签:
【中文标题】Replace(Environment.NewLine, "<br/>") 在网页上显示文本时未按预期工作【英文标题】:Replace(Environment.NewLine, "<br/>") is not working as expected when displaying text on a web page 【发布时间】:2012-01-05 22:38:22 【问题描述】:我不确定为什么以下代码没有按预期工作:
litMessage.Text = messageBody.Replace(Environment.NewLine, "<br/>")
其中litMessage
是文字控件的名称,messageBody
是字符串变量的名称。
我的目的是将字符串输出到网页上,并用 br 标签替换换行符,以便它可以正确显示在页面上。然而,什么都没有被取代。查看页面源代码时,字符串中似乎仍然存在换行符。同样,通过 MsgBox 显示字符串时,也正常显示。我也试过用pre
标签包装输出,它也能正确显示换行符。
字符串最初是由用户通过使用 asp:Textbox 输入的,并保存到 MSSQL 数据库中。它使用 asp:Literal 控件检索并显示在另一个网页上。字符串在提交之前唯一发生的事情是它被修剪(即textbox.Text.Trim())
。
也许有什么我没有考虑到的?
编辑#1:由于时间限制,我决定只用pre
标签包装文本。这是一个可以接受的解决方法,因为它保留了换行符。不幸的是,它没有解释为什么代码一开始就不起作用。同时,在找到正确答案之前,我将不回答这个问题。
编辑#2:在下面找到并回答了解决方案。已将 UpdatePanel 标签添加到问题中以供将来参考。
【问题讨论】:
为什么不使用 myString.Replace("\n", "") 呢?替换将适用于每个平台,因为“\n”包含在每个版本的换行符中。 并非总是如此,显然 :-): en.wikipedia.org/wiki/Newline#Representations @Alexander Galkin 我试过了,结果是一样的。 【参考方案1】:重新审视这个问题后,我发现问题是由更新面板引起的。
做了更多测试,我使用以下代码查看了字符串包含的内容:
MsgBox(textbox.Text.Contains(vbCr))
MsgBox(textbox.Text.Contains(vbCrLf))
MsgBox(textbox.Text.Contains(vbNewLine))
MsgBox(textbox.Text.Contains(Environment.Newline))
所有四个语句都返回错误。在发送到数据库之前对字符串以及从数据库检索到的字符串进行了测试。
在我看来,标记上一定有一些东西可以删除换行符。起初,我认为 Literal、Textbox 和 Label 控件在后面的代码中检索时对换行符做了一些有趣的事情。事实并非如此(如果微软让这种情况发生,那就太奇怪了)。
再梳理一下代码,我发现所有这些控件都在一个 UpdatePanel 中。回想起我之前对 UpdatePanels 的负面体验,我认为这可能只是罪魁祸首。我删除了它,你瞧,代码中的换行符并没有消失。我刚刚发布的代码返回 true。
两个页面都有用于提交文本和在 UpdatePanel 中显示文本的控件。我发现从页面中检索文本时换行符消失了。在页面上显示文本时,UpdatePanel 不会以任何方式更改字符串。以下代码最终运行良好:
litMessage.Text = messageBody.Replace(Environment.NewLine, "<br/>")
虽然我仍然不确定为什么在使用 pre
标记甚至使用 javascript 警报框显示检索到的值时仍能正确显示换行符。
【讨论】:
UpdatePanel 使用 AJAX 请求。他们将在解密时通过 ajax 将编码标签作为纯文本发送。这就是为什么没有换行符,因为它全部压缩到 1 行以减小 ajax 调用的大小【参考方案2】:很难从您发布的代码中说出来,但是如果您将 myString
变量本身传递给页面(而不是 Replace
函数的返回值),您需要做 -
myString = myString.Replace(Environment.NewLine, "<br/>")
在传递给页面之前。
【讨论】:
感谢您的回复。我去仔细检查了代码,它与您的建议相似。我已将我的问题编辑得更清楚。【参考方案3】:如果您使用 UPDATEPANEL,myText..Replace(Environment.NewLine, "<br/>")
将不起作用。我发现了艰难的方式(已经花了 2 个小时)
解决方案(使用更新面板时)是这样设置“PostBackTrigger”:
<asp:UpdatePanel runat="server" ID="pnlUpdate" UpdateMode="Conditional">
<Triggers>
<asp:PostBackTrigger ControlID="btnDoThatShitAlready" />
</Triggers>
【讨论】:
【参考方案4】:刚刚在寻找解决方案时发现了这一点,当文本控件位于表单视图中时,它无法使用文本控件中的文本进行替换。我解决它的方法是,在文字的数据绑定中,将文本传递给字符串,对字符串进行替换,然后将处理后的文本放回文字的文本字段中。
Protected Sub MyLit_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
Dim text1 As String
text1 = CType(myFormView.FindControl("MyLit"), Literal).Text
text1 = Replace(text1, Environment.NewLine, "<br />")
CType(myFormView.FindControl("MyLit"), Literal).Text = text1
End Sub
我希望这对您以及任何可能访问该网站寻求解决方案的人有所帮助。
【讨论】:
【参考方案5】:关于上面4个失败的测试(作者:nullexception)...
MsgBox(textbox.Text.Contains(vbCr))
MsgBox(textbox.Text.Contains(vbCrLf))
MsgBox(textbox.Text.Contains(vbNewLine))
MsgBox(textbox.Text.Contains(Environment.Newline))
我尝试了这些测试,但它们对我来说也失败了。然后,我注意到没有针对 vbLf 的测试,所以我对其进行了测试。答对了!就是这样!
所以,这行得通...
Label.Text = MultiLineTextBox.Text.Replace(ControlChars.Lf, "<br />")
【讨论】:
【参考方案6】:我浪费了两个小时来寻找真正的问题所在。 好吧,解决方案是使用 ControlChars.Lf 代替 Environment.NewLine
您可以删除更新面板,这将为将来的数据解决问题。但如果您已经有一些数据,使用 ControlChars.Lf 会有所帮助。
【讨论】:
【参考方案7】:你可以这样使用它,因为System.NewLine
返回一个"\r\n"
字符串
dim messageBody as string = "some text here";
litMessage.Text = messageBody.Replace("\r\n", "< br />");
【讨论】:
最佳实践是使用 Environment.NewLine 而不是直接编码\r\n
。这使得代码更加可移植。【参考方案8】:
litMessage.Text = messageBody.Replace("\\\\n","< br />").Replace(Environment.NewLine, "< br />")
它对我有用。希望这也对你有用。
【讨论】:
【参考方案9】:var str = "Text sample to replace carriage return + newline ("
+ (char)13 + (char)10
+ @") and
the Environment.NewLine and "
+ Environment.NewLine
+ " and the unix \n new line character.";
str.Replace("\r\n","<br />")
.Replace(Environment.NewLine, "<br />")
.Replace("\n", "<br />");
输出是
Text sample to replace carriage return + newline (<br />) and<br /> the Environment.NewLine and <br /> and the unix <br /> new line character.
【讨论】:
Environment.NewLine 正确确定主机系统(Windows \r\n 或 Unix \n)使用的 NewLine 类型,它本身不是 NewLine 类型。 但是如果文本来自互联网并且服务器不知道 \n 是用于客户端的 NewLine 怎么办。这就是 Replace(Environment.NewLine, "") 失败的原因,我的意思是 Environment.NewLine 用于服务器端的新行,而不是客户端的新行。客户端将发送 (char)13 + (char)10 或 \n 或使用 Environment.NewLine 通过代码更改文本。我同意在同一个块中使用 all 是多余的,但我不认为是其他方式【参考方案10】:要将标签文本放在下一行,我们可以使用下面提到的解决方案。
<asp:Label ID="lblAppointmentLocation" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Location").ToString().Replace(Environment.NewLine, "<br/>").Replace("\n", "<br />") %>'></asp:Label>
【讨论】:
【参考方案11】:你真正要找的是:
@html.Raw(@Regex.Replace(input_to_be_printed_correctly, @"\r\n?|\n", "<br />"))
【讨论】:
【参考方案12】:我正在使用此代码并且它有效: 而不是
.Replace(Environment.NewLine, "<br/>")
使用
.Replace("\n", "<br />")
希望有用。
【讨论】:
以上是关于Replace(Environment.NewLine, "<br/>") 在网页上显示文本时未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章