Подтвердить что ты не робот

Почему StringBuilder.AppendLine не добавляет новую строку с некоторыми строками?

Я пытаюсь использовать stringbuilder для создания тела строки, которое будет использоваться в текстовом (а не HTML) письме. Однако некоторые строки (где я включают динамические данные, новая строка не добавляется, но в некоторых новостях работает так, как предполагалось).

Есть ли что-то базовое, которое я пропускаю при использовании класса stringbuilder или есть еще один фундаментальный процесс, который должен произойти?

в приведенном ниже коде:

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email [email protected]");
sbUser.AppendLine();
sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy"));
sbUser.AppendLine("==============================================================");
sbUser.AppendLine();

(ContentPage и thisEvent - это пользовательские классы, созданные с использованием Subsonic (v2). PageTitle - это тип вывода строки)

получает это как результат:

    Please find below confirmation of your registration details. If any of these details are incorrect, please email [email protected]

Selected event : My Event Date of event : 16 Sept 2012 ==============================================================

как вы можете видеть, все после третьей строки в коде делает все в одной строке.

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

sbRR.AppendLine("First name : " + txtFirstname.Text.Trim());
sbRR.AppendLine("Surname : " + txtSurname.Text.Trim());
etc,

и все они отображаются на отдельных строках правильно. Я не понимаю, почему это происходит.

письмо составлено как таковое

mailMessage.Body = sbUser.ToString() + sbRR.ToString();


добавив следующий код:

sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle + Environment.NewLine); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy") + Environment.NewLine);

выводит следующий результат:

Selected event : My Event

Date of event : 16 Sept 2012

==============================================================

который работает, предположим, кроме него добавлено 2 новых строки (AppendLine и Environment.NewLine). кажется, что вытащить данные прямо прямо из базы данных в построитель строк, кажется, возится с окончанием строки. Даже если я добавляю текст после выталкивания базы данных, он все равно остается на одной строке.

UPDATE

делать StringBuilder.Append("blah"+Environment.NewLine) дает правильный результат, однако я все еще не понимаю, почему это работает, а .AppendLine("blah"+<database content>) не работает.

4b9b3361

Ответ 1

Вместо

sbUser.AppendLine();

Попробуйте использовать

sbUser.Append(Environment.NewLine);

Не знаю, почему это работает...

Ответ 2

Я знаю, что вопрос старый и помечен как ответный, но я подумал, что добавлю это здесь, если кто-то еще столкнется с этим, так как это первый удар по Google из-за StringBuilder.AppendLine() не работает.

У меня была та же проблема, и это оказалось проблемой Outlook. Outlook переформатирует текстовые электронные письма, удаляя лишние разрывы строк. Вы можете нажать "Мы удалили лишние разрывы строк в этом сообщении → Восстановить разрывы строк" в заголовке отдельного письма или изменить настройку, которая делает этот неприятный маленький трюк "Options->Mail->Message Format->Remove extra line breaks in plain text messages"

Обходной путь (поскольку вы не можете управлять настройками для каждого потенциального целевого объекта электронной почты), я нашел здесь Форматирование бюллетеня и проблему удаления лишних разрывов строк. По сути, если вы добавите два пробельных символа в начало каждой строки, Outlook не будет переформатировать электронную почту.

Здесь поможет метод расширения (имя метода немного многословно, поэтому измените его по своему вкусу :))

namespace System.Text
{
    public static class StringBuilderExtensions
    {
        public static void AppendLineWithTwoWhiteSpacePrefix(this StringBuilder sb, string value)
        {
            sb.AppendFormat("{0}{1}{2}", "  ", value, Environment.NewLine);
        }

        public static void AppendLineWithTwoWhiteSpacePrefix(this StringBuilder sb)
        {
            sb.AppendFormat("{0}{1}", "  ", Environment.NewLine);
        }
    }
}

Ответ 3

использовать Environment.NewLine

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email [email protected]");
sbUser.AppendLine(Environment.NewLine);
sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy"));
sbUser.AppendLine("==============================================================");
sbUser.AppendLine(Environment.NewLine);

Ответ 4

используйте Environment.NewLine после каждой строки или для новой строки

например: -

  sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email [email protected]" + Environment.NewLine);
  sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 

Ответ 5

Windows 10 Insider preview Build 15007. Терминатор строки по умолчанию и Environment.NewLine оба являются "\n". Чтобы использовать "\r\n", мне нужно было создать строковую константу и использовать ее вместо этого.

Ответ 6

Первый sbUser.Appendline();

Во-вторых sbUser.Append("texto loco ");

Voila!

=)