【问题标题】:Razor views as email templatesRazor 视图作为电子邮件模板
【发布时间】:2011-05-21 02:36:04
【问题描述】:

我正在 mvc3 中创建一个电子邮件引擎,并尝试使用 razor 视图作为电子邮件模板。 我听说这是可能的,但我还没有找到任何关于它的信息。

【问题讨论】:

标签: templates asp.net-mvc-3 razor


【解决方案1】:

您可以使用http://razorengine.codeplex.com/ 来实现此目的。它允许您在 mvc 之外使用 razor。

string Email = "Hello @Model.Name! Welcome to Razor!";
string EmailBody = Razor.Parse(Email, new { Name = "World" });

它易于实施,可在http://nuget.codeplex.com/ 上获取,以便轻松集成到您的项目中。

【讨论】:

  • 我一定会在@BuildStarted 中检查这个。不过有一个问题:所以如果我理解正确,这不是默认情况下内置到剃须刀中的吗?
  • 看起来不错。还有一个问题:你还能使用 *.cshtml “pages” 作为模板吗?
  • 不,它不是默认内置在剃须刀中的。好问题。虽然我确信它可以通过 razor 处理 cshtml 页面,但它不支持开箱即用,因为您必须添加一个额外的模板来支持诸如 @Html 功能之类的功能。可能值得在 codeplex 页面上请求该支持。虽然 MVC 有它自己的 razor 解析器,它实际上与 razor 本身是分开的,所以我不确定它是否可以轻松完成。
  • 感谢@BuildStarted - 例如,在 Windows 服务中完成电子邮件处理时,这是非常有用的实用程序/库。
  • 你把cshtml模板放在哪里了?资源?
【解决方案2】:

您可以使用模板文件作为 Razor 电子邮件正文模板。您可以使用您选择的任何扩展名,因为您可以在 .Net 中将文件加载为文本。让我们使用以下示例作为模板:

Hello @Model.Name,

Welcome to @Model.SiteName!

Regards,
Site Admins

将该文件另存为“WelcomeMessage.cshtml”、“WelcomeMessage.template”等文件。在“解决方案资源管理器”中选择该文件,然后在“属性”窗口中选择“复制到输出目录”并选择“始终复制”。唯一的缺点是这个模板必须伴随应用程序并且不能作为一个类编译。

现在我们想将其解析为字符串以分配给邮件正文。 Razor 将获取模板和模型类,解析它们,然后返回具有必要值的字符串。 在您的应用程序中,您需要添加可以通过 NuGet 找到的 RazorEngine 包。下面是一个简短的代码示例来说明用法:

using System.IO;
using RazorEngine;

// ...
MyModel model = new MyModel { Name = "User", SiteName = "Example.com" };
string template = File.OpenText("WelcomeMessage.template").ReadToEnd();
string message = Razor.Parse(template, model);

它与其他答案类似,但显示了一种从文本文件加载模板的快速方法。

【讨论】:

    【解决方案3】:

    您或许应该考虑MvcMailer。如果你还没有使用 MVC(我已经在 webforms 上下文中成功使用它),RazorEngine 是(非常)好,但如果你有 MVC,你也可以利用它。

    (通过Hanselmen's NuGet package of the week 2

    【讨论】:

    • 请注意,MvcMailer 需要HttpContext,这就是为什么 RazorEngine 是非 MVC 用户的不错选择,或者如果您计划从后台任务发送电子邮件。
    【解决方案4】:

    您还可以使用来自 NuGet 的 Essential Mail: Razor 包。它基于 RazorEngine 构建,并为电子邮件呈现提供简单的界面。

    电子邮件模板看起来像

    @inherits Essential.Templating.Razor.Email.EmailTemplate
    @using System.Net;
    @{
        From = new MailAddress("example@email.com");
        Subject = "Email Subject";
    }
    @section Html 
    {
       <html>
          <head>
              <title>Example</title>
          </head>
          <body>
              <h1>HTML part of the email</h1>
          </body>
       </html>
    }
    @section Text 
    {
        Text part of the email.
    }
    

    在 GitHub 上阅读更多信息:https://github.com/smolyakoff/essential-templating/wiki/Email-Template-with-Razor

    【讨论】:

      【解决方案5】:

      Mailzor

      与@thiagoleite 提到的内容相关联,我采纳了 Kazi Manzur Ra​​shid 的想法(经许可)并扩展了内容,以便对我想要的使用方式更加友好。

      请查看github project 'mailzor'

      它也在Nuget.org/packages/mailzor

      【讨论】:

      • 如果有必要披露说明是我正在维护/工作的东西。
      猜你喜欢
      • 2012-09-21
      • 2016-01-12
      • 2011-08-27
      • 2010-10-02
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多