在挖掘了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,使我能夠進入果園基礎設施訪問視圖引擎等。
這不是最漂亮的解決方案,需要徹底測試,但似乎要做我所做的之後。
如果有人有一些反饋,或想要完整的代碼,請隨時給我一條線。
感謝@Richard,我會檢查出來。 – Brendan
所以在您的解決方案中,您可以使用它來渲染任何形狀以用作電子郵件模板?你如何提出視圖名稱? – Brendan
我硬編碼的視圖名稱,但你應該能夠從part.TypeDefinition.NameI認爲它。 –