Orchard CMS如何将形状呈现为电子邮件模板

4
我正在尝试将形状呈现为电子邮件模板。我希望能够从后台任务以及当前请求中执行此操作。有人有任何提示吗?我认为Orchard.DisplayManagement.IDisplayHelperFactory是关键,但然后我需要制造ViewContext和IViewDataContainer,我可能可以从Orchard.Mvc.ViewEngines.Razor.WebViewPage获取这些对象。

有人做过类似的事情吗?我正在查看https://github.com/andrewdavey/postal/blob/master/src/Postal/EmailViewRenderer.cs以获取一些灵感,只是想知道是否有人能给我指点迷津?

再次感谢!

2个回答

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,以便能够利用orchard基础设施访问视图引擎等。
这并不是最美观的解决方案,需要经过彻底的测试,但似乎已经达到了我的目的。
如果有任何反馈或需要完整代码,请随时与我联系。

0

听起来你已经解决了这个问题,但我也想利用Orchard中的Razor视图引擎创建模板邮件。因此,我提出了一个关于在Orchard中使用FindView的问题。

我认为你可能会发现答案很有用,包括我添加的一个展示最终解决方案的答案:

在Orchard中使用FindView


那么,使用您的解决方案,您可以使用它来呈现任何形状以用作电子邮件模板吗?您是如何想出视图名称的? - Brendan
我已经硬编码了视图名称,但是你应该能够从part.TypeDefinition.NameI中获取它。 - Richard Garside
您可以从shape.Metadata.Type获取视图名称。我喜欢您的方式,唯一的问题是那样我就无法使用包装器将形状变成完整的HTML文档并包含样式表等内容。 - Brendan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接