果园cms渲染形状作为电子邮件模板

时间:2011-08-15 01:50:08

标签: email orchardcms

我正在尝试将形状渲染为电子邮件模板。我希望能够从后台任务以及当前请求中执行此操作。有没有人对我有任何提示?我认为Orchard.DisplayManagement.IDisplayHelperFactory是关键,但后来我需要制作ViewContext和IViewDataContainer,我可能从Orchard.Mvc.ViewEngines.Razor.WebViewPage得到它?

有人做过类似的事吗?我正在寻找https://github.com/andrewdavey/postal/blob/master/src/Postal/EmailViewRenderer.cs的灵感,只是想知道是否有人能让我走上正轨?

提前再次感谢!

2 个答案:

答案 0 :(得分: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来自邮政项目。这用于构建控制器和查看上下文。然后我只需要扩展orchard的WebViewPage来创建EmailWebViewPage,这使我能够利用果园基础设施来访问视图引擎等。

这不是最漂亮的解决方案,需要经过彻底的测试,但似乎可以完成我所追求的目标。

如果有人有一些反馈,或者想要完整的代码,请随时给我留言。

答案 1 :(得分:0)

听起来你有这个排序,但我也想进入Orchard的Razor View Engine创建模板化的电子邮件。所以,我问了一个关于在Orchard中使用FindView的问题。

我认为您可能会发现答案很有用,包括我添加的答案以显示我的最终解决方案:

Using FindView in Orchard