电子邮件视图

时间:2010-05-27 01:38:05

标签: asp.net-mvc model-view-controller asp.net-mvc-2

我最近在讨论应该在ASP.NET MVC应用程序中发送电子邮件(通知等)的地方。我的克星 grin 认为只有从控制器发送电子邮件才有意义。

我认为电子邮件只是通过不同渠道的备用或增强视图。就像我将文件下载为ActionResult的有效负载一样,电子邮件只是通过不同的协议传递。

我使用了一种扩展方法,允许我执行以下操作:

<% Html.RenderEmail(model.FromAddress, model.ToAddress, model.Subject); %>

我实际上包含在我在屏幕上显示的视图中。美丽的是,根据惯例,如果我从名为MyView.ascx的父视图调用RenderEmail,我会尝试呈现名为MyViewEmail.ascx的视图的内容,除非找不到,在这种情况下我只是通过电子邮件发送副本父母的看法。

它确实使它可以测试(我仍然有一个ISMTPService注入测试),我想知道是否有人对是否违反良好做法有任何想法。在使用中,当我们需要轻松发送电子邮件或修改电子邮件结果的内容与浏览器呈现的结果时,它非常方便。

谢谢,

哈尔

3 个答案:

答案 0 :(得分:3)

你的“克星”是正确的。

视图的工作是将HTML发送到客户端,而不是其他任何内容。没有业务发送电子邮件。

您应该在控制器内发送电子邮件。

如果要渲染电子邮件的视图,可以像这样呈现:

var viewData = new ViewDataDictionary<T>(data);
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, "ViewName");

using (var writer = new StringWriter(CultureInfo.InvariantCulture)) {
    ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, viewData, new TempDataDictionary(), writer);
    viewResult.View.Render(viewContext, writer);

    viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);

    return writer.ToString();
}

答案 1 :(得分:0)

你看过MvcMailer了吗?请参阅NuGet包hereproject documentation

希望它有所帮助!

答案 2 :(得分:0)

会话答案

我完全理解你的想法。退出微软的MV-whatever框架,看看更原始的MVC设置,可能是有指导意义的。

如果表示状态可以是您想要的任何东西,那么在Web应用程序中,视图不必只发送HTML 。实际上,如果正在处理传入的HTTP Accept:标头,它将包含可以帮助您确定要回复哪种表示状态的媒体类型。

在通过JavaScript进行XMLHttpRequest的情况下,Accept:标头可能会显示application/jsonapplication/xml。客户端将期待JSON或XML。发送HTML是错误的。

现在,由于电子邮件没有直接发送给客户用户代理(提交表单后),因此,处理表单的副作用更多,而不是必须提供的代表性状态。符合并回复。在更“纯”的MVC环境中,电子邮件将由模型作为服务发送。 Controller不会参与发送电子邮件,因为这不是应用程序的业务逻辑所在。

尽管如此,您认为电子邮件(SMTP而不是HTTP)至少可以是辅助视图的观点具有一定的共鸣性。但是,这可能需要(取决于应用程序)将大量数据从模型传递到假设的“ EmailView”。如果这没有障碍,那么问题就在于需要更新主视图(网页)并在模型放置时使用次视图发送电子邮件在 idle 中。

因此,允许该模型发送电子邮件作为业务逻辑的一部分,这是非常实用的。然后,允许视图更新用户代理。这就是为什么我说发送电子邮件比真正的View更具有副作用

但是,有关SMTP的要点。出于所有实际目的,基本Web应用程序的Accept:标头几乎几乎不会说application/batch-SMTP

如果您正在编写服务器端电子邮件应用程序怎么办?是的,那么您可能会一直看到传入的application/batch-SMTP。 :-)

IANA: Media Types