Orchard 1.6 を使用しており、テーマのカスタム レイアウトなどを使用してビューを文字列にレンダリングしたいと考えています。
実際、電子メール テンプレートとして形状をレンダリングする orchard cmsがありますが、さらに詳細が必要です (その回答にコメントを追加することはできません。十分な担当者がいません:(、プライベート メッセージを送信できません)。
私はテストのためにコントローラーでそれを行います(将来的には別のタスクで int を行いたいです)。したがって、コントローラーは(モデルはいくつかのプロパティを持つ単純なクラスです)
var renderer = new ViewRenderer(
_workContextAccessor,
_siteThemeService,
_services);
var shape = ShapeFactory.MyTestShape(Model: model);
var result = renderer.RenderMessage(shape);
レンダラーは
public string RenderMessage(dynamic shape)
{
var httpContext = new ViewRendererHttpContext(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 ViewRendererWebViewPage(viewContext, new ViewDataDictionary<dynamic>(shape.Model));
var displayHelperFactory = _services.WorkContext.Resolve<IDisplayHelperFactory>();
var display = displayHelperFactory.CreateHelper(page.ViewContext, page);
var data = display(shape).ToHtmlString();
scope.Dispose();
return data;
}
ViewRendererHttpContext は HttpContextBase から派生したばかりで非常に単純です (コードを投稿できます)。DummyController は Controller から派生した空のクラスであり、ShapeView は IView から派生した空のクラスです。
私のモジュールには View/MyTestShape.cshtml があります。
問題は、var data = display(shape).ToHtmlString();
詳細
に実行する場合var result = htmlHelper.Partial(harvestShapeInfo.TemplateVirtualPath, displayContext.Value);
(クラス "ShapeTemplateBindingStrategy"、メソッド "private IHtmlString Render(......)") で、"メソッドまたは操作が実装されていません" という例外があります。
どのメソッドをどのクラスに実装する必要がありますか?
ヒントをありがとう。私の英語はとても下手です。