在Render()方法中错误地写入writer时出现混乱

时间:2011-06-07 07:55:48

标签: c# .net asp.net render

有人可以解释一下这里发生了什么。

我有以下标记:

<html>
<head runat="server">
    <title>My title</title>
    <my:MyControl runat="server" ID="myControl" />
</head>
...

我的自定义控件是这样的:

public MyControl : Control
{
    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write("<script>this is my script</script>");
        base.Render(writer);
    }
}

当渲染页面时,整个头部的上半部分被切掉,所以html呈现如下:

<html>
    <script>this is my script</script>
</head>

解决方案是在base.Render之后调用writer.Write,如下所示:

base.Render(writer);
writer.Write("<script>this is my script</script>");

为什么?!

更新

我对这个问题的兴趣感到惊讶!

我发现为什么我的头标记的顶部被移除了 - 这是一个HttpHandler的错误,我用来'清理'html(它将脚本移到底部等)。

这仍然无法解释为什么更改渲染方法的顺序会导致错误消失,但我确信这一切都有合理的解释!

3 个答案:

答案 0 :(得分:1)

你只是用你从函数中返回的内容覆盖你的身体内容:

<script>this is my script</script>

答案 1 :(得分:0)

在这两种情况下,我会仔细查看呈现的HTML。听起来您的脚本可能会错误地呈现,这会导致以下html无法呈现。更改顺序将改变html渲染的顺序,这意味着错误不会影响页面的大部分。

答案 2 :(得分:0)

以下是如何正确覆盖Control.Render(HtmlTextWriter writer)方法,向下滚动到示例部分: http://msdn.microsoft.com/en-us/library/system.web.ui.htmltextwriter.aspx

必不可少的部分是

        // Create a non-standard markup element.
        writer.RenderBeginTag("MyTag");
        writer.Write("Contents of MyTag");
        writer.RenderEndTag();
        writer.WriteLine();

否则,您可能会混淆HtmlTextWriter的缩进层次结构等。

对您的具体示例更简单的解决方案 - 如果您不想以编程方式更改<head>标记的属性 - 将标记<head runat="server">更改为仅<head>