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

时间:2013-10-20 21:32:25

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 mailmessage

我的申请分为三层:

  1. 查看(MVC)
  2. 业务逻辑(服务)
  3. 数据(LINQ / SQL)
  4. 在我的服务层中,我调用了一个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传递到此视图中,并为其生成电子邮件正文的字符串?

1 个答案:

答案 0 :(得分:6)

要呈现视图,您需要使用view engineview 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();

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

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