40

我正在尝试使用 stringbuilder 创建要在文本(不是 HTML)电子邮件中使用的字符串正文。但是有些行(我包括动态数据,没有添加新行,但在某些行中,换行符按预期工作。

使用 stringbuilder 类时我是否缺少一些基本的东西,或者是否应该发生一些更基本的过程?

在下面的代码中:

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com");
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 someone@somewhere.com

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

如您所见,代码中第 3 行之后的所有内容都使所有内容都继续到一行。

但是,在我使用的代码下方:

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)。似乎将数据直接从数据库中提取到 stringbuilder 似乎会弄乱行尾。即使我在数据库拉取后添加文本,它仍然保持在一行。

更新

StringBuilder.Append("blah"+Environment.NewLine) 会产生正确的结果,但是我仍然不明白为什么会起作用和.AppendLine("blah"+<database content>)不起作用。

4

6 回答 6

42

我知道这个问题已经过时并且已被标记为已回答,但我想我会在此处添加此内容,以防其他人遇到此问题,因为它是 Google 首次因StringBuilder.AppendLine()无法正常工作而受到打击。

我遇到了同样的问题,结果是 Outlook 问题。Outlook 通过删除额外的换行符来重新格式化基于文本的电子邮件。您可以单击单个电子邮件标题中的“我们删除了此邮件中的额外换行符 -> 恢复换行符”,或更改执行此讨厌小技巧的设置"Options->Mail->Message Format->Remove extra line breaks in plain text messages"

解决方法(因为您无法控制每个潜在电子邮件目标的设置)我在这里找到了Newsletter Formatting And The Remove Extra Line Breaks Issue。基本上,如果您在每行的开头添加两个空格字符,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);
        }
    }
}
于 2014-07-21T08:26:51.463 回答
29

代替

sbUser.AppendLine();

尝试使用

sbUser.Append(Environment.NewLine);

不知道为什么这有效...

于 2012-06-22T12:07:24.697 回答
6

采用Environment.NewLine

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com");
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);
于 2012-06-22T12:07:32.160 回答
0

Environment.NewLine在每一行之后或你想要换行的地方使用

例如:-

  sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com" + Environment.NewLine);
  sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
于 2012-06-22T12:08:41.480 回答
0

Windows 10 Insider Preview Build 15007。默认行终止符和Environment.NewLine都是"\n". 要使用"\r\n",我必须创建一个字符串常量并改用它。

于 2017-01-15T23:11:31.130 回答
-3

第一的 sbUser.Appendline();

第二 sbUser.Append("texto loco ");

瞧!

=)

于 2015-06-11T18:54:53.750 回答