【问题标题】:Generating a view without a controller in MVC?在 MVC 中生成没有控制器的视图?
【发布时间】:2013-10-29 06:31:29
【问题描述】:

我的应用分为三层:

  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
        }

假设我这样定义剃刀视图:

@model System.Net.Mail.MailMessage

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

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

【问题讨论】:

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


    【解决方案1】:

    要渲染视图,您需要使用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 作为您当前方法的替代方案。它们都基于使用视图(例如 razor)生成电子邮件的相同原理。设置非常简单,奖励物有所值。

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

    【讨论】:

    • 我在使用 FindView 时遇到了一些问题 - 我尝试使用 RenderBody() 添加一个空白布局页面,但没有解决。当我深入研究这一点时 - 我不喜欢使用 Postal 或 MVCMailer 的想法,因为它是另一个外部依赖项,可能无法在 MVC4 之后得到维护。这就是为什么我要尝试这种手工制作的方法。想法?
    • 我个人不会担心。两者都足够成熟,可以独立站立一段时间,并且到目前为止都保持良好状态。它们也是开源的;如果他们需要被接管,那么他们可能会。
    • 知道了,谢谢。我在上面建议的代码 sn-p 上遇到了很多麻烦(ControllerContext 无效,视图名称无法识别等);我将讨论 MVCMailer,因为它看起来更成熟。我可以单独使用它来生成消息,这样我就可以保留我的异步代码吗?
    • 不应该是异步的问题。确保您在正确的位置获得了视图。视图应该在正确的视图文件夹中,_Layout(或类似的)应该在共享视图文件夹中。
    • 邮政已被所有者“取消列出”,并且 MvcMailer 不支持 VS2017,最后更新于 2013 年 3 月 17 日。我有一条消息给它的所有者,看看他是否打算更新它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多