オーチャードのソースを掘り起こし、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を作成して、ビューエンジンなどにアクセスするためのオーチャードインフラストラクチャを利用できるようにしなければなりませんでした。
これは非常に優れたソリューションではありません。後になる。
フィードバックがある方、または完全なコードをご希望の場合は、私にご連絡ください。
おかげ@Richardが、私はそれをチェックアウトします。 – Brendan
あなたのソリューションでは、それを使用して電子メールテンプレートとして使用する任意の図形をレンダリングできますか?あなたはどのようにビュー名を思いつきますか? – Brendan
私はビュー名をハードコードしましたが、part.TypeDefinition.NameIから取得できるはずです。 –