置換(Environment.NewLine、 "<br/>")は、Webページにテキストを表示するときに期待通りに機能しません

なぜ次のコードが意図したとおりに動作しないのかわかりません:

litMessage.Text = messageBody.Replace(Environment.NewLine, "
")

ここで、 litMessage はリテラルコントロールの名前で、 messageBody は文字列変数の名前です。

私の意図は、Webページに文字列を出力し、改行をbrタグで置き換えて、ページに正しく表示できるようにすることです。しかし、何も置き換えられません。ページソースを見ると、文字列に改行が残っているように見えます。同様に、MsgBoxを介して文字列を表示すると、通常通り同様に表示されます。また、出力を pre タグでラップしようとしましたが、改行も正しく表示されます。

この文字列は、もともとasp:Textboxを使用してユーザによって入力され、MSSQLデータベースに保存されていました。これは、asp:Literalコントロールを使用して取得され、別のWebページに表示されます。それが提出される前にストリングに起こる唯一の事は、それが整えられていることです(すなわち、 textbox.Text.Trim())

おそらく、私が考慮しなかったものがあるでしょうか?

Edit #1: Due to time constraints, I've decided to just wrap the text with the pre tag. It's an acceptable work around as it preserves the line breaks. Unfortunately, it doesn't explain why the code didn't work in the first place. In the meantime, I'll just leave the question unanswered until I find a proper answer.

Edit #2: Solution found and answered below. UpdatePanel tag added to the question for future reference.

4
代わりにmyString.Replace( "\ n"、 "

")を使用しないでください。 "\ n"はすべてのバージョンの改行記号に含まれているため、置き換えはすべてのプラットフォームで動作します。
追加された 著者 Alexander Galkin,
必ずしもそうではありません:-): en.wikipedia.org/wiki/Newline#Representations
追加された 著者 Hans Kesting,
@アレクサンダーガルキン私はそれを試して、結果は同じです。
追加された 著者 nullexception,

12 答え

この問題を再確認した後、私はupdatepanelsが問題を引き起こしていることを発見しました。

もう少しテストをして、次のコードを使用して文字列の内容を調べました。

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

4つのステートメントはすべてfalseを返しました。これは、データベースに送信する前の文字列と、データベースから取得した文字列でテストされました。

私の見地からは、改行を取り除くマークアップ上に何かがなければならなかった。最初は、リテラル、テキストボックス、およびラベルのコントロールは、コードの中で取り出されたときに改行するのに面白いことをしたと思いました。これは当てはまりません(マイクロソフトがこれを許した場合、奇妙なことです)。

もう少しコードを重ねると、これらのコントロールはすべてUpdatePanelの中​​にあることがわかりました。以前の私のUpdatePanelsに対する否定的な経験を思い出して、私はこれがちょうど犯人かもしれないと思った。私はそれを削除して見て、改行はコード内で消えませんでした。私が上に掲示したコードは真実を返しました。

どちらのページにも、テキストを送信してUpdatePanel内にテキストを表示するコントロールがありました。私は、ページからテキストを取り出すときに改行が消えたことを発見しました。ページにテキストを表示するとき、UpdatePanelは文字列を変更しません。次のコードは正常に動作しました。

litMessage.Text = messageBody.Replace(Environment.NewLine, "
")

pre タグを使用したり、JavaScriptアラートボックスを使用して取得した値を表示しても、改行が正しく表示される理由はまだ分かりません。

6
追加された
UpdatePanelはAJAXリクエストを使用します。彼らは暗号化されたタグを解読するとプレーンテキストとしてajax経由で送るでしょう。これは、AJAX呼び出しのサイズを小さくするために、1行にすべてが収縮するため、改行がないためです
追加された 著者 Sarfaraaz,

If you use an UPDATEPANEL the myText..Replace(Environment.NewLine, "
")
WILL NOT WORK. I found out the hard way (spent 2 hours already)
The solution (when using updatepanel) is to set a "PostBackTrigger" like this:



<triggers>


3
追加された

投稿したコードからは言い難いですが、 myString 変数自体を( Replace 関数の戻り値ではなく)ページに渡している場合は、あなたはする必要があります -

myString = myString.Replace(Environment.NewLine, "
")

それをページに渡す前に。

2
追加された
御返答いただき有難うございます。私は行って、コードをダブルチェックし、それはあなたの提案に似ています。私はより明確に私の質問を編集しました。
追加された 著者 nullexception,

ちょうどフォームビュー内に常駐している間、リテラルコントロール内のテキストで作業しない置換用のソリューションを探している間にこれを見つけました。私が解決した方法は、リテラルのデータバインディングで文字列にテキストを渡すことでした。文字列の置換を行い、処理されたテキストをリテラルのテキストフィールドに戻しました。

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, "
") CType(myFormView.FindControl("MyLit"), Literal).Text = text1 End Sub

私はこれがあなたと、このサイトを訪問する可能性のある他の誰にも役立つことを願っています。

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, "
")
2
追加された

System.NewLine "\ r \ n" 文字列を返すので、このように使うことができます dim messageBody as string = "ここにいくつかのテキスト";

litMessage.Text = messageBody.Replace("\r\n", "< br />");
1
追加された
\ r \ n を直接コーディングするのではなく、Environment.NewLineを使用するのがベストプラクティスです。これによりコードははるかに移植性に優れます。
追加された 著者 Frazell Thomas,

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

それは私のために働いています。これがあなたにとってもうまくいくと思います。

1
追加された

I wasted my two hours finding what was actually wrong. Well, solution is instead of Environment.NewLine, use ControlChars.Lf

将来のデータの問題を解決するupdatepanelを削除することができます。しかし、すでにデータがある場合は、ControlChars.Lfを使用すると役立ちます。

1
追加された
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","
") .Replace(Environment.NewLine, "
") .Replace("\n", "
");

出力は

Text sample to replace carriage return + newline (
) and
the Environment.NewLine and
and the unix
new line character.
0
追加された
しかし、テキストがインターネットを経由して来て、サーバーがクライアント側の\ nがNewLineのものであることをサーバーが知らない場合はどうでしょうか?これはReplace(Environment.NewLine、 "
")が失敗する理由です。Environment.NewLineはクライアント側ではなくサーバー側の新しい行です。クライアントは13 +(char)10または\ nを送信(char)し、Environment.NewLineを使用してコードを介してテキストを変更することができます。私は同じブロック内のすべての使用が冗長であることに同意するが、私は他の方法とは思わない
追加された 著者 Adrian Iftode,
Environment.NewLineは、ホストシステム(Windows \ r \ nまたはUnix \ n)で使用されているNewLineタイプを適切に決定します.NewLineは、NewLineタイプではありません。
追加された 著者 Frazell Thomas,

あなたが本当に探しているものは次のとおりです:

@Html.Raw(@Regex.Replace(input_to_be_printed_correctly, @"\r\n?|\n", "
"))
0
追加された

私はこのコードを使用しており、それは動作します: の代わりに

.Replace(Environment.NewLine, "
")

つかいます

.Replace("\n", "
")

役に立つと願っています。

0
追加された

ラベルのテキストを次の行に入れるには、以下の解決方法を使用します。


0
追加された