在网页上显示文本时,替换(Environment.NewLine,“<br/>”)无法正常工作

时间:2011-11-24 21:07:38

标签: asp.net html vb.net updatepanel line-breaks

我不确定为什么以下代码无法正常工作:

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

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

我的目的是将一个字符串输出到一个网页上,并用一个br标签替换换行符,以便它可以正确地显示在页面上。但是,没有任何东西被取代查看页面源时,看起来字符串中仍然存在换行符。同样,当通过MsgBox显示字符串时,它也会正常显示。我还尝试使用pre标记包装输出,并且它也正确显示换行符。

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

也许有些事情我没有考虑过?

编辑#1:由于时间限制,我决定用pre标记包装文本。这是一个可以接受的工作,因为它保留了换行符。不幸的是,它没有解释为什么代码首先不起作用。与此同时,我会直截了当地回答这个问题,直到找到合适的答案。

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

12 个答案:

答案 0 :(得分:6)

重新审视此问题后,我发现updatepanels导致了问题。

进行更多测试,我使用以下代码查看了包含的字符串:

MsgBox(textbox.Text.Contains(vbCr))
MsgBox(textbox.Text.Contains(vbCrLf))
MsgBox(textbox.Text.Contains(vbNewLine))
MsgBox(textbox.Text.Contains(Environment.Newline))

所有四个语句都返回false。在发送到数据库之前以及从数据库检索的字符串上对字符串进行了测试。

从我的观点来看,标记上必须有一些东西可以删除换行符。起初,我认为Literal,Textbox和Label控件在后面的代码中检索时对换行符做了一些有趣的事情。情况并非如此(如果微软允许这种情况发生,这将是奇怪的。)

更多地梳理代码,我发现所有这些控件都在UpdatePanel中。记住我之前使用UpdatePanels的负面体验,然后我认为这可能只是罪魁祸首。我把它删除了,看哪,换行符没有在代码中消失。我上面发布的代码都返回true。

两个页面都有控件,用于提交文本并在UpdatePanel中显示文本。我发现从页面检索文本时换行符消失了。在页面上显示文本时,UpdatePanel不会以任何方式更改字符串。以下代码最终正常工作:

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

虽然我仍然不确定为什么在使用pre标记时仍能正确显示换行符,甚至使用javascript警告框显示检索到的值。

答案 1 :(得分:3)

很难从您发布的代码中说出来,但是如果您将myString变量本身传递给页面(而不是Replace函数的返回值),那么您将会需要做 -

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

在将其传递给页面之前。

答案 2 :(得分:3)

如果您使用UPDATEPANEL,则myText..Replace(Environment.NewLine, "<br/>")将无效。我发现了困难的方式(已经花了2个小时)
解决方案(使用updatepanel时)是设置一个“PostBackTrigger”,如下所示:

<asp:UpdatePanel runat="server" ID="pnlUpdate" UpdateMode="Conditional">

<Triggers>
<asp:PostBackTrigger ControlID="btnDoThatShitAlready" />
</Triggers>

答案 3 :(得分:2)

在寻找替换解决方案时发现这一点,当它位于窗体视图中时,不能使用文字控件中的文本。我解决它的方法是,在文字的数据绑定中,将文本传递给字符串,对字符串执行替换,然后将处理后的文本放回文字的文本字段中。

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 :(得分:2)

关于失败的上述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 />")

答案 5 :(得分:1)

您可以像这样使用它,因为System.NewLine会返回"\r\n"字符串 dim messageBody as string =“some text here”;

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

我浪费了两个小时才发现实际上是错的。 好吧,解决方案是 而不是Environment.NewLine,使用ControlChars.Lf

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

答案 8 :(得分:0)

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.

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

你真正想要的是:

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

答案 11 :(得分:0)

我正在使用此代码并且它有效: 而不是

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

使用

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

希望有用。