4

我的应用程序分为三层:

  1. 查看 (MVC)
  2. 业务逻辑(服务)
  3. 数据(LINQ / SQL)

在我的服务层中,我调用了一个 EmailSender 服务,该服务当前通过 SmtpClient 和 MailMessage 发送纯文本电子邮件。据我所知,相当标准的东西。

我现在尝试通过使用接受 MailMessage 作为模型的 Razor 模板来格式化这些电子邮件的正文,并生成一些我可以粘贴到邮件正文中的 HTML。

现在这就是我所拥有的:

public void SendAsyncEmail(MailMessage message)
        {
            message.IsBodyHtml = true;

            message.body = {generate html string from body here using razor?}

            // Async code here
        }

假设我定义了一个这样的剃刀视图:

@model System.Net.Mail.MailMessage

<div>
    <h1>@Model.Subject</h1>
    <p>@Model.Body</p>
</div>

如何从我的服务方法将 MailMessage 传递到此视图并从中生成一个字符串作为电子邮件正文?

4

1 回答 1

6

要渲染视图,您需要使用视图引擎视图上下文。视图引擎负责查找和渲染视图。视图上下文包含有关视图及其状态的信息。

public ActionResult Index()
{
    StringWriter sw = new StringWriter();
    ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, "Index", "_Layout");
    ViewContext context = new ViewContext(ControllerContext, result.View, ViewData, TempData, sw);
    result.View.Render(context, sw);
    result.ViewEngine.ReleaseView(ControllerContext, result.View);

    string viewString = sw.ToString();

    return Content(viewString);
}

传递模型使用ViewData(即控制器提供的属性)。

ViewData.Model = new MailMessage();

我还想强烈推荐 PostalMvcMailer作为您当前方法的替代方案。它们都基于使用视图(例如 razor)生成电子邮件的相同原理。设置非常简单,奖励是值得的。

如果您的应用程序使用大量电子邮件,那么我建议您尝试一下。

于 2013-10-20T22:06:02.257 回答