2

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(......)") で、"メソッドまたは操作が実装されていません" という例外があります。

どのメソッドをどのクラスに実装する必要がありますか?

ヒントをありがとう。私の英語はとても下手です。

4

1 に答える 1

2

Orchard 1.6 を使用しています。以前は機能させるための投票がありましたが、Orchard 1.7 で採用されたかどうかはわかりません。

コントローラーから呼び出しを行う場合、これが私のプロジェクトで行う方法です (ajax DataTables の文字列に形状をレンダリングします)。

サービス (ま​​たはコントローラー) 内で、IThemeAwareViewEngine と IDisplayHelperFactory の 2 つのサービスに手を差し伸べます。

    private readonly IThemeAwareViewEngine _themeAwareViewEngine;
    private readonly IDisplayHelperFactory _displayHelperFactory;
    public AjaxDataTables(
        IThemeAwareViewEngine themeAwareViewEngine,
        IDisplayHelperFactory displayHelperFactory
        )
    {
        _themeAwareViewEngine = themeAwareViewEngine;
        _displayHelperFactory = displayHelperFactory;
    }

実際のコントローラーへの参照がある場合、魔法のディスプレイを取得する方法は次のとおりです。

    dynamic GetDisplayHelper(Controller controller)
    {
        // We can specify any view name, just to get a View only, the shape template finding will be taken care by DisplayHelperFactory.
        // Here the "Brandking" view is always existed, we can also use something like "Layout" ...
        var viewResult = _themeAwareViewEngine.FindPartialView(controller.ControllerContext, "Branding", false, false);
        var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, new StringWriter());
        return _displayHelperFactory.CreateHelper(viewContext, new ViewDataContainer());
    }
    private class ViewDataContainer : IViewDataContainer
    {
        public ViewDataDictionary ViewData { get; set; }
    }

そして形状を文字列にレンダリングします:

var display = GetDisplayHelper(controller);
var str = Convert.ToString(display(shape.Content));

繰り返しますが、これはコントローラー アクションから呼び出す場合にのみ機能します。

HTH、ホイ

于 2013-08-09T04:17:03.003 に答える