在MVC中生成没有控制器的视图?

Rob*_*ous 4 asp.net-mvc mailmessage asp.net-mvc-3 asp.net-mvc-4

我的应用程序分为三层:

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

在我的服务层中,我调用了一个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
        }
Run Code Online (Sandbox Code Playgroud)

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

@model System.Net.Mail.MailMessage

<div>
    <h1>@Model.Subject</h1>
    <p>@Model.Body</p>
</div>
Run Code Online (Sandbox Code Playgroud)

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

Row*_*man 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);
}
Run Code Online (Sandbox Code Playgroud)

传递模型使用ViewData(即可从控制器获得的属性).

ViewData.Model = new MailMessage();
Run Code Online (Sandbox Code Playgroud)

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

如果您的应用程序使用了大量电子邮件,那么我建议您尝试使用它们.