2010-05-27 52 views
0

我最近一直在讨论关于应该在ASP.NET MVC应用程序中发送电子邮件(通知等)的位置。我的克星咧嘴笑认为它只是有道理的,应该从控制器发送电子邮件。作为视图的电子邮件

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

我工作的扩展方法,可以让我做到以下几点:

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

,我其实是包括我所显示的屏幕上的视图中。美丽在于,根据约定,如果我从名为MyView.ascx的父视图中调用RenderEmail,我会尝试渲染名为MyViewEmail.ascx的视图的内容,除非找不到,在这种情况下,我只需将副本父视图。

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

感谢,

哈尔

回答

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(); 
} 
+0

我只是将电子邮件视为相同视图的替代呈现 - 同一视图模型,仍然只显示文本。我确实看到这是一个动作发送邮件,但ViewResult对我来说很有意义。感谢您的反馈。 – Hal 2010-05-27 01:51:47

+0

您可能对电子邮件呈现相同的视图,但视图本身不应发送电子邮件。 – SLaks 2010-05-27 02:10:35

相关问题