2010-05-27 55 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

相關問題