Заменить (Environment.NewLine, "") не работает должным образом при отображении текста на веб-странице - PullRequest
4 голосов
/ 25 ноября 2011

Я не уверен, почему следующий код не работает должным образом:

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 ]

6 голосов
/ 17 февраля 2012

После повторного рассмотрения этой проблемы я обнаружил, что проблема возникла из-за панелей обновления.

Проведя дополнительное тестирование, я изучил, что содержится в строке, используя следующий код:

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

Все четыре утверждения вернули ложь.Это было проверено на строке перед отправкой в ​​базу данных, а также на строке, полученной из базы данных.

С моей точки зрения, в разметке должно было быть что-то, что убирало разрывы строк.Сначала я подумал, что элементы управления Literal, Textbox и Label сделали что-то смешное с разрывами строк при получении в коде позади.Это не так (и было бы странно, если бы Microsoft позволила этому случиться).

Еще раз прочесав код, я обнаружил, что все эти элементы управления находятся внутри UpdatePanel.Вспомнив мой предыдущий негативный опыт с UpdatePanels, я подумал, что это может быть просто виновником.Я удалил его, и вот, разрывы строк не исчезли в коде.Код, который я разместил чуть выше всего, вернул true.

На обеих страницах были элементы управления для отправки текста и отображения текста внутри UpdatePanel.Я обнаружил, что разрывы строк исчезли при извлечении текста со страницы.При отображении текста на странице UpdatePanel никак не изменяет строку.Следующий код работал нормально:

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

Хотя я все еще не уверен, почему разрывы строк по-прежнему отображались правильно при использовании тега pre или даже при отображении полученного значения с помощью окна предупреждения javascript.

3 голосов
/ 18 июля 2012

Если вы используете UPDATEPANEL, myText..Replace(Environment.NewLine, "<br/>") НЕ РАБОТАЕТ. Я выяснил трудный путь (провел уже 2 часа)
Решение (при использовании updatepanel) состоит в том, чтобы установить «PostBackTrigger» следующим образом:

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

<Triggers>
<asp:PostBackTrigger ControlID="btnDoThatShitAlready" />
</Triggers>
3 голосов
/ 25 ноября 2011

Трудно сказать из кода, который вы разместили, но если вы передаете саму страницу myString varaible (а не возвращаемое значение функции Replace), вам нужно сделать -

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

перед передачей на страницу.

2 голосов
/ 02 июня 2016

Относительно 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 />")
2 голосов
/ 24 мая 2012

Только что нашел это, когда искал решение для замены, не работающей с текстом в литеральном элементе управления, пока он находится внутри формы.Я решил, что в привязке данных для литерала передать текст в строку, выполнить замену строки, а затем поместить обработанный текст обратно в текстовое поле литерала.

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

Iнадеюсь, что это поможет вам и всем, кто может посетить этот сайт для решения.

1 голос
/ 09 июля 2016

Я потратил впустую два часа, чтобы найти то, что было на самом деле не так.Ну, решение вместо Environment.NewLine, используйте ControlChars.Lf

. Вы можете удалить панель обновления, которая решит проблему для будущих данных.Но если у вас уже есть некоторые данные, использование ControlChars.Lf поможет.

1 голос
/ 07 мая 2013

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

Это сработало для меня. Надеюсь, это сработает и для вас.

1 голос
/ 25 ноября 2011

Вы можете использовать это так, потому что System.NewLine возвращает "\r\n" string dim messageBody как string = "некоторый текст здесь";

litMessage.Text = messageBody.Replace("\r\n", "< br />");
0 голосов
/ 08 мая 2017

Я использую этот код, и он работает: Вместо

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

использовать

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

Надеюсь быть полезным.

0 голосов
/ 04 декабря 2015

То, что вы действительно ищете, это:

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