我的申请分为三层:
在我的服务层中,我调用了一个EmailSender服务,该服务目前通过SmtpClient和MailMessage发送明文电子邮件。据我所知,相当标准的东西。
我现在正在尝试使用Razor模板格式化这些电子邮件的主体,该模板接受MailMessage作为模型,并生成一些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传递到此视图中,并为其生成电子邮件正文的字符串?
答案 0 :(得分:6)
要呈现视图,您需要使用view engine和view context。视图引擎负责查找和呈现视图。视图上下文包含有关视图及其状态的信息。
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();
我还想强烈推荐 Postal和MvcMailer作为您当前方法的替代方案。它们都遵循使用视图(例如剃刀)生成电子邮件的相同原则。设置非常简单,奖励是值得的。
如果您的应用程序使用了大量电子邮件,那么我建议您尝试使用它们。