2011-08-10 22 views
0

我有一個控制器叫做EmailController,這是(你猜對了)負責發送電子郵件。可重複使用的地方放置電子郵件查看渲染邏輯?

一個例子是我的網站的用戶可以「喜歡」東西,如果其他用戶對這些「東西」中的某個做了某些事情,那麼我需要發送一封電子郵件給所有「喜歡」它。有點像電子郵件警報。

問題是,即時通訊不知道如何調用我的EmailController的操作方法,從其他操作方法(這是用戶做某事時的HTTP POST)。

通常我會把這種操作(電子郵件)的到服務,和實際發電子郵件邏輯(SMTP)是在服務,但EmailController負責建立電子郵件的內容(例如HTML),因爲它需要將視圖呈現給一個字符串(因此,它需要控制器上下文並且不能進入服務)。

我該如何做到這一點?

我不能只使用靜態輔助方法,因爲我怎樣才能渲染視圖?我需要將控制器上下文傳遞給方法或其他東西。

實施例流程:

  1. 用戶A進入一個頁面和提交表單。
  2. HTTP POST ControllerAActionMethodA調用,數據提交給數據庫。
  3. 卡住了。

因此,在第3步,我需要:

  1. 拉一些信息出來的數據只是POST'ed
  2. 創建一個視圖模型
  3. 呈現一個強類型的視圖爲字符串
  4. 呼叫我創建了一個服務方法來發送SMTP電子郵件

目前,我有2/3/4 ABOV e在EmailController中,所以我希望能夠使用它。

作爲一個側面說明,我希望使電子郵件異步(因爲誰剛剛創建的另一個用戶需要通過電子郵件獲取一些數據不關心用戶)。

任何人都可以給我一些建議,關於如何組織這些單獨關注(提交數據,創建HTML視圖到字符串,發送電子郵件)。

也許一個基本控制器中的HTML幫助程序或受保護的方法比控制器更好嗎?

僅供參考,這是我的「查看以字符串」方法(我從另一個堆棧問題拉,和偉大工程):

protected string RenderViewToString(string viewName, object model) 
{ 
    if (string.IsNullOrEmpty(viewName)) 
     viewName = ControllerContext.RouteData.GetRequiredString("action"); 

    ViewData.Model = model; 

    using (var sw = new StringWriter()) 
    { 
     var viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, null); 
     var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
     viewResult.View.Render(viewContext, sw); 

     return sw.GetStringBuilder().ToString(); 
    } 
} 

回答

0

你可以看看從的NuGet中的ActionMailer包。那麼你不需要一個單獨的控制器。

+0

看起來很有希望。主要是你不需要發送一個單獨的HTTP請求。將試一試,讓你知道我是如何去的。 – RPM1984

+0

工作非常好。我不得不做一些小竅門:因爲沒有HTTP上下文,需要通過任何URL的依賴關係,等等。但是很好地工作,並且與我的自定義視圖引擎一起工作也很好。謝謝! – RPM1984

+0

很高興聽到,很高興我能幫上忙。 –

相關問題