我不确定为什么以下代码不能按预期工作:
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 />")
希望有用。