我正在尝试将形状渲染为电子邮件模板。我希望能够从后台任务以及当前请求中执行此操作。有没有人对我有任何提示?我认为Orchard.DisplayManagement.IDisplayHelperFactory是关键,但后来我需要制作ViewContext和IViewDataContainer,我可能从Orchard.Mvc.ViewEngines.Razor.WebViewPage得到它?
有人做过类似的事吗?我正在寻找https://github.com/andrewdavey/postal/blob/master/src/Postal/EmailViewRenderer.cs的灵感,只是想知道是否有人能让我走上正轨?
提前再次感谢!
答案 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的问题。
我认为您可能会发现答案很有用,包括我添加的答案以显示我的最终解决方案: