Replace(Environment.NewLine, "<br/>") 在网页上显示文本时未按预期工作



我不确定为什么以下代码不能按预期工作:

litMessage.Text = messageBody.Replace(Environment.NewLine, "<br/>")

其中litMessage是文字控件的名称,messageBody是字符串变量的名称。

我的意图是将字符串输出到网页上,并用br标记替换换行符,以便它可以正确地显示在页面上。然而,没有任何东西被替换。查看页面源时,字符串中似乎仍然存在换行符。类似地,当通过MsgBox显示字符串时,它也会正常显示。我还尝试过用pre标记包装输出,它也正确地显示了换行符。

该字符串最初是由用户通过使用asp:Textbox输入的,并保存到MSSQL数据库中。它是使用asp:Literal控件检索并显示在另一个网页上的。在提交字符串之前,唯一会发生的事情是对其进行修剪(即textbox.Text.Trim()).

也许有什么是我没有考虑到的?

编辑#1:由于时间限制,我决定只使用pre标记包装文本。这是一个可以接受的变通办法,因为它保留了换行符。不幸的是,它并没有解释为什么代码一开始就不起作用。在此期间,在我找到合适的答案之前,我不会回答这个问题。

编辑#2:在下面找到并回答了解决方案。UpdatePanel标记添加到问题中以供将来参考。

在重新审视这个问题后,我发现更新面板导致了这个问题。

在做更多的测试时,我使用以下代码查看了字符串中包含的内容:

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警报框显示检索到的值时,换行符仍然正确显示。

从您发布的代码中很难说,但如果您将myString变量本身传递到页面(而不是Replace函数的返回值(,则需要执行-

myString = myString.Replace(Environment.NewLine, "<br/>")

然后将其传递到页面。

如果使用UPDATEPANEL,myText..Replace(Environment.NewLine, "<br/>")将不起作用。我发现了艰难的道路(已经花了2个小时(
解决方案(当使用updatepanel时(是设置这样的"PostBackTrigger":

<asp:UpdatePanel runat="server" ID="pnlUpdate" UpdateMode="Conditional">
<Triggers>
<asp:PostBackTrigger ControlID="btnDoThatShitAlready" />
</Triggers>

刚刚在寻找替换解决方案时发现了这一点,因为当文本控件驻留在表单视图中时,它不能与文本一起工作。我解决这个问题的方法是,在文本的数据绑定中,将文本传递给字符串,对字符串进行替换,然后将处理后的文本放回文本的文本字段。

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

我希望这能帮助你,以及任何其他可能访问该网站寻求解决方案的人。

关于上面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 />")

我浪费了两个小时来寻找真正的错误。好吧,解决方案是而不是Environment.NewLine,使用ControlChars.Lf

您可以删除updatepanel,它将为将来的数据解决问题。但是如果你已经有了一些数据,使用ControlChars.Lf会有所帮助。

您可以这样使用它,因为System.NewLine返回一个"rn"字符串dim messageBody as string="此处有一些文本";

litMessage.Text = messageBody.Replace("rn", "< br />");

litMessage.Text = messageBody.Replace("\\n","< br />").Replace(Environment.NewLine, "< br />")

它对我有效。希望这对你也有效。

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("rn","<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.

要将标签文本放在下一行,我们可以使用下面提到的解决方案。

<asp:Label ID="lblAppointmentLocation" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Location").ToString().Replace(Environment.NewLine, "<br/>").Replace("n", "<br />") %>'></asp:Label>

您真正想要的是:

@Html.Raw(@Regex.Replace(input_to_be_printed_correctly, @"rn?|n", "<br />"))

我使用的是这段代码,它的工作原理是:代替

.Replace(Environment.NewLine, "<br/>")

使用

.Replace("n", "<br />")

希望有用。

最新更新