0

我正在尝试从另一个组件中渲染一个组件。

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

问题是 Block 组件找不到它的模板。

ResourceProcessingException 消息:无法处理资源“components\CustomReportComponentComponent\default.vm”:找不到资源

我想,由于组件未正确初始化,可能会出现其他问题。

是否可以从另一个组件的 Render 方法中初始化一个组件,使其呈现就像从 .vm 调用一样?

4

1 回答 1

0

我认为您需要使用新的 .Init 调用IViewComponentContext

  component.Init(EngineContext, newViewComponentContext);

现在实现IViewComponentContext在各种视图引擎中。问题是 - 我不熟悉 NVelocity 的内部结构,所以我不能确定如何使用 NV 做到这一点,你需要一个后续问题。

一种可能的解决方法:您可以拥有一个共享视图模板,该模板调用一个组件,其名称作为参数传递给视图。

在 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 回答