【问题标题】:Best way to intercept control rendering拦截控件渲染的最佳方法
【发布时间】:2011-01-13 11:59:23
【问题描述】:

我在我们的 CMS 中使用了一个控件,但我们没有它的源代码,我想做的是更改此控件的渲染输出。

现在,我可以在我的基本 Page 类中检查该控件是否正在页面上使用,然后更改需要更改的 html,但这对于仅使用 1 次似乎有点过分。

那么有没有其他方法可以在没有源代码的情况下改变控件的行为?除了上面描述的方式之外,我正在考虑其他方式。

谢谢

【问题讨论】:

  • 渲染后的html可以用javascript修改吗?
  • 这是我的第一个想法,但说实话它看起来不太好,因为它稍微影响了布局。

标签: asp.net content-management-system


【解决方案1】:

将其包装在自定义控件中:

public class MyCMSControl: CommercialCMSControl
{
    protected override void Render(HtmlTextWriter writer)
    {
        StringBuilder stringBuilder = new StringBuilder();
        StringWriter stringWriter = new StringWriter(stringBuilder );

        using (HtmlTextWriter myWriter = new HtmlTextWriter(stringWriter ))
        {
            base.Render(myWriter);

            string newOutput;
            // the original output is in stringBuilder, do whatever you want, and
            // put it in newOutput


            writer.Write(newOutput);
        }
    }
}

如果您希望能够在特定于页面的代码中操作输出,请添加一个事件,例如:

public delegate void OnRenderHandler(object sender, string originalOutput, HtmlTextWriter writer)
public OnRenderHandler OnRender;
...
/// before writer.Write above...
if (OnRender!=null) {
    OnRender(this,stringBuilder.ToString(),writer);
}

要使您的自定义版本在设计器中可用,您需要 web.config 中的某些内容

<pages>
  <controls>
    <add namespace="My.Control.Namespace" assembly="My.Control.Assembly" tagPrefix="MyControlsPrefix"/>
  </controls>
</pages>

【讨论】: