我正在尝试使用另一个组件渲染组件。
public override void Render()
// ...
var block = new Block();
block.Init(EngineContext, Context);
block.Render();
// ...
}
问题是Block组件找不到它的模板。
ResourceProcessingException消息:无法处理资源'components \ CustomReportComponentComponent \ default.vm':无法找到资源
我想,由于组件未正确初始化,可能会出现其他问题。
是否可以从另一个组件的Render方法中初始化组件,因此它呈现就像从.vm调用一样?
答案 0 :(得分: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的参数(再次 - 需要另一个后续问题,抱歉)