3

要求是在我正在工作的应用程序中,我使所有电子邮件都可以编辑。

显而易见的解决方案是将所有消息存储在数据库中,并使用文本编辑器供用户编辑消息。

但是,我想知道如何设计电子邮件中的占位符。

消息的占位符也必须存储在数据库中。一条消息可以有许多占位符。占位符可以在许多消息中。

我可以允许用户在插入占位符时从占位符列表中选择一个占位符。

电子邮件消息需要包含占位符标记,通常是 {0}、{1} 等,但出于显示目的,这需要更加用户友好,例如 $WebsiteLink$。一些占位符是直截了当的,例如仅根据部署或登录用户的名称更改的网站链接。

其他占位符更复杂。它们依赖于在特定时间从数据库中获取信息,例如选定的团队成员姓名。所以对于这个占位符而不是保存一些静态文本,我可能需要调用一个方法或事件来获取该信息。

我不清楚如何做到这一点。你能帮我吗?

我希望规格清楚,如果没有,请告诉我?

4

4 回答 4

3

如需简单的String.Format替换,请查看Phil Haack 的这篇博文(以及后续文章)。

那里的解决方案意味着您可以使用命名占位符,例如{name}or{date}而不是{0}.

这并不能解决整个 UI 问题,但至少占位符更清晰。

于 2012-04-20T12:11:43.753 回答
1

要么你可以按照哥特人的建议去做(或者甚至看看这个,我没用过,但看起来很可爱),或者有另一种方式:

1.你建立一个HTML模板,我们称之为mailTemplate.html

(当心,桌子......)

<table>
    <tr>
        <td> 
            <%MY_PLACEHOLDER%>
        </td>
    </tr>
</table>

2.然后你可以简单地在一个方法中使用它,假设这templatePath是你的模板文件的物理路径:

var mailDefinition = new MailDefinition
                         {
                              BodyFileName = templatePath,
                              IsBodyHtml = true,
                              From = ... // you'll have to fill that
                         };
string replacementForPlaceholder = "Look at me!";
var replacements = new ListDictionary { { "<%MY_PLACEHOLDER%>", replacementForPlaceholder }};

string recipients = ... // well, specify recipients
var message = mailDefinition.CreateMailMessage(recipients, replacements, new LiteralControl());

您的消息已准备好发送。如果您没有对 HTML 表格和诸如此类的东西过于疯狂,那么如果收件人禁用了 HTML,邮件就会优雅地降级为文本。

于 2012-04-20T10:23:17.667 回答
0

上个月,我实现了以下使用 Razor 语法的基于模板的 EmailModule。它应该适用于您的情况。它很容易实现。

http://kazimanzurrashid.com/posts/use-razor-for-email-template-outside-asp-dot-net-mvc

感谢 Kazi Manzur Ra​​shid。

于 2012-04-20T10:06:24.337 回答
0

C# now supports interpolation. For anyone still worrying about this, take a look here.

于 2017-04-13T06:04:53.347 回答