0

別のコンポーネントからコンポーネントをレンダリングしようとしています。

public override void Render()
// ...
    var block = new Block();
    block.Init(EngineContext, Context);
    block.Render();
// ...
}

問題は、ブロック コンポーネントがそのテンプレートを見つけられないことです。

ResourceProcessingException メッセージ: リソース 'components\CustomReportComponentComponent\default.vm' を処理できません: リソースが見つかりませんでした

コンポーネントが適切に初期化されていないため、他の問題が発生する可能性があると思います。

別のコンポーネントの Render メソッド内からコンポーネントを初期化して、.vm から呼び出されたかのようにレンダリングすることはできますか?

4

1 に答える 1

0

新しい .Init を呼び出す必要があると思いますIViewComponentContext

  component.Init(EngineContext, newViewComponentContext);

現在、 の実装IViewComponentContextはさまざまなビュー エンジン内にあります。問題は、私は NVelocity の内部構造に詳しくないため、NVelocity でそれを行う方法について確信が持てないことです。フォローアップの質問が必要です。

考えられる回避策: 名前がパラメータとしてビューに渡されるコンポーネントを呼び出す共有ビュー テンプレートを使用できます。

AspView では、次のようになります。

// in the calling component
PropertyBag["componentName"] = "theOtherComponent";
PropertyBag["componentParams"] = new Hashtable{{age,30},{name,"Ken"}};
var componentOutput = RenderViewInPlace("/shared/render_component");


// in render_component.aspx
<% InvokeViewComponent(Properties["componentName"], Properties["componentParams"], null, null); %>

NV が #blockcomponent のパラメーターを取得できると仮定すると、このアプローチは理論的には機能するはずです (再度 - 別のフォローアップの質問が必要です。申し訳ありません)。

于 2010-05-06T05:46:02.563 に答える