Asp.net mvc 在MVC中生成没有控制器的视图?

Asp.net mvc 在MVC中生成没有控制器的视图?,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,mailmessage,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Mailmessage,我的应用程序分为三层: 视图(MVC) 业务逻辑(服务) 数据(LINQ/SQL) 在我的整个服务层中,我有对EmailSender服务的调用,该服务当前通过SmtpClient和MailMessage发送明文电子邮件。据我所知,这是相当标准的东西 我现在尝试使用Razor模板格式化这些邮件的正文,该模板接受邮件作为模型,并生成一些HTML,我可以将其粘贴到邮件正文中 这就是我现在所拥有的: public void SendAsyncEmail(MailMessage message)

我的应用程序分为三层:

  • 视图(MVC)
  • 业务逻辑(服务)
  • 数据(LINQ/SQL)
  • 在我的整个服务层中,我有对EmailSender服务的调用,该服务当前通过SmtpClient和MailMessage发送明文电子邮件。据我所知,这是相当标准的东西

    我现在尝试使用Razor模板格式化这些邮件的正文,该模板接受邮件作为模型,并生成一些HTML,我可以将其粘贴到邮件正文中

    这就是我现在所拥有的:

    public void SendAsyncEmail(MailMessage message)
            {
                message.IsBodyHtml = true;
    
                message.body = {generate html string from body here using razor?}
    
                // Async code here
            }
    
    假设我这样定义一个razor视图:

    @model System.Net.Mail.MailMessage
    
    <div>
        <h1>@Model.Subject</h1>
        <p>@Model.Body</p>
    </div>
    
    @model System.Net.Mail.MailMessage
    @模型.主题
    @模特。身体


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

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

    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
    (即控制器提供的属性)

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


    如果你的应用程序使用了大量电子邮件,我建议你试试。

    我在FindView方面遇到了一些问题-我尝试使用RenderBy()添加一个空白布局页面,但无法解决。当我深入研究这一点时,我不喜欢使用Postal或MVCMailer,因为它是另一个可能无法通过MVC4维护的外部依赖项。这就是为什么我要尝试这种手工制作的方法。想法?我个人不会担心的。两者都已经足够成熟,可以独立存在一段时间,而且到目前为止一直保持良好状态。它们也是开源的;如果他们需要被接管,他们可能会的。明白了,谢谢。我对上面建议的代码片段有很多问题(ControllerContext无效,视图名称无法识别,等等);我要去看看MVCMailer,因为它看起来更成熟了。我可以单独使用它来生成消息,这样我就可以保留我的异步代码了吗?异步应该没有问题。确保你在正确的地方看到了风景。视图应位于右视图文件夹中,而_布局(或类似布局)应位于共享视图文件夹中。所有者已将Postal“未列出”,MvcMailer不支持VS2017,最后一次更新日期为2013年3月17日。我有一条消息要告诉它的主人,看看他是否打算更新它。
    ViewData.Model = new MailMessage();