如何通过.RenderConrol使asp:panel呈现为div

时间:2010-07-22 15:09:10

标签: asp.net ajax json controls rendering

tl:dr version:

有没有办法在RenderControl渲染时让面板呈现为div?

背景:

我正在使用asp.net 1.1网站,我正在尝试将包含面板的控件渲染为字符串,以便我可以将其作为JSON传递回页面并刷新部分页面。

我正在渲染控件:

StringWriter twHeader = new StringWriter();
Html32TextWriter HeaderWriter = new Html32TextWriter(twHeader);             
MyHeader.RenderControl(HeaderWriter);
HeaderWriter.Close();
string HeaderHtml = twHeader.ToString()

导航到包含MyHeader控件的页面时,该控件中的面板将呈现为div。但是,当我在MyHeader上调用RenderControl时,面板将呈现为表格,因此当使用HeaderHtml更新页面时,布局会爆炸。

有没有办法在RenderControl渲染时让面板呈现为div?

附加信息:

当我第一次查看问题时,我认为这可能是一个浏览器问题,但是当我查看web.config时,我看到我们已经根据此网站设置了browsercaps:http://slingfive.com/pages/code/browserCaps/

我认为我可以通过使用<div runat="server">而不是面板来解决这个问题,最后这可能是最好的解决方案,但在这一点上我很好奇是否有办法获得面板做我想做的事。

2 个答案:

答案 0 :(得分:1)

我倾向于创建一个继承自Panel(MyPanel,比如说)的类,使用它代替Panel并覆盖MyPanel中的Render方法来做我想做的事。

答案 1 :(得分:1)

在我看到Yellowfog的回答之前,我继续尝试使用服务器端div而不是Panels。具有讽刺意味的是,我实际上使用了一个继承自Panel的类,它碰巧被称为MyPanel:不确定是否会使Yellowfog获得通灵徽章或令人毛骨悚然的徽章:)。我不想采用这种方法的主要原因是因为我没有编写MyPanel类,并且不想处理对它的任何更改我可能必须从HtmlGenericControl继承而不是小组但转换非常轻松,而且效果很好。

在阅读了Yellowfog的回答之后,我想我也会给他的建议一个旋转:

public class MyPanel : Panel
{
    //snip

    protected override void Render(HtmlTextWriter output)
    {
        output.Write("<div id=\"{0}\" class=\"{1}\"", this.ID, this.CssClass);
        this.RenderChildren(output);
        output.Write("</div>");
    }

    //snip
}

这也很有效。