【问题标题】:Render ViewComponent from another component codebehind从另一个组件代码隐藏渲染 ViewComponent
【发布时间】:2010-05-05 19:45:57
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 视图组件实例的初始化是视图引擎的职责。意思是,从一个视图组件调用另一个组件并不容易,但是从一个视图来看它更简单一些。我对NV内部不是很熟悉。使用 AspView(也许还有盲文)应该可以做到这一点。

标签: .net castle-monorail


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-12-12
    • 2019-04-19
    • 2019-04-25
    • 2014-08-23
    • 2021-12-04
    • 2015-11-20
    • 2013-01-20
    • 1970-01-01
    相关资源
    最近更新 更多