从另一个组件代码隐藏渲染ViewComponent

时间:2010-05-05 19:45:58

标签: .net castle-monorail

我正在尝试使用另一个组件渲染组件。

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

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

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

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

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

1 个答案:

答案 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的参数(再次 - 需要另一个后续问题,抱歉)