2011-08-15 51 views
4

我想渲染形狀作爲電子郵件模板。我希望能夠從後臺任務和當前請求中完成此任務。有沒有人對我有任何提示?我認爲Orchard.DisplayManagement.IDisplayHelperFactory是關鍵,但是接下來我需要製作ViewContext和IViewDataContainer,我可能從Orchard.Mvc.ViewEngines.Razor.WebViewPage獲得這些內容嗎?果園cms渲染形狀作爲電子郵件模板

任何人都做過類似的事情嗎?我在尋找https://github.com/andrewdavey/postal/blob/master/src/Postal/EmailViewRenderer.cs的靈感,想知道是否有人能讓我走上正軌?

再次提前致謝!

回答

3

在挖掘了Orchard源代碼和Andrew Davey的郵政應用程序的一些靈感後,我設法提出了一個解決方案。請參閱以下代碼片段

private void RenderMessage(MessageContext context, dynamic shape) 
{ 
     var httpContext = new EmailHttpContext(new Uri("http://localhost/orchard/"));    
     var routeData = new RouteData(); 
     routeData.DataTokens.Add("IWorkContextAccessor", _workContextAccessor); 
     routeData.Values["controller"] = "Dummy"; 
     var requestContext = new RequestContext(httpContext, routeData); 
     var controllerContext = new ControllerContext(requestContext, new DummyController()); 
     var viewContext = new ViewContext(controllerContext, new ShapeView(shape), new ViewDataDictionary(shape.Model), new TempDataDictionary(), new StringWriter()); 
     var scope = _workContextAccessor.CreateWorkContextScope(viewContext.HttpContext); 
     scope.WorkContext.CurrentTheme = _siteThemeService.GetSiteTheme();    
     var page = new EmailWebViewPage(viewContext, new ViewDataDictionary<dynamic>(shape.Model)); 

     var displayHelperFactory = _services.WorkContext.Resolve<IDisplayHelperFactory>();    
     var display = displayHelperFactory.CreateHelper(page.ViewContext, page); 
     context.MailMessage.Body = display(shape).ToHtmlString(); 
     scope.Dispose(); 
    } 

    class DummyController : Controller 
    { 
    } 

    class ShapeView : IView 
    { 
     private readonly dynamic _shape; 

     public ShapeView(dynamic shape) 
     { 
      _shape = shape; 
     } 

     #region IView Members 

     public void Render(ViewContext viewContext, TextWriter writer) 
     { 
     } 

     #endregion 
    } 

EmailHttpContext取自郵政項目。這被用來構造控制器和視圖上下文。然後,我不得不延長果園的WebViewPage創建EmailWebViewPage,使我能夠進入果園基礎設施訪問視圖引擎等。

這不是最漂亮的解決方案,需要徹底測試,但似乎要做我所做的之後。

如果有人有一些反饋,或想要完整的代碼,請隨時給我一條線。

0

這聽起來像你有這種排序,但我也想挖掘烏節的Razor View Engine來創建模板化的電子郵件。所以,我問了一個關於在Orchard中使用FindView的問題。

我想你可能會發現答案是有用的,包括我加入到展示我的最終解決方案之一:

Using FindView in Orchard

+0

感謝@Richard,我會檢查出來。 – Brendan

+0

所以在您的解決方案中,您可以使用它來渲染任何形狀以用作電子郵件模板?你如何提出視圖名稱? – Brendan

+0

我硬編碼的視圖名稱,但你應該能夠從part.TypeDefinition.NameI認爲它。 –