【问题标题】:Chaos when incorrectly writing to writer during Render() method在 Render() 方法期间错误地写入 writer 时出现混乱
【发布时间】:2011-09-09 20:53:58
【问题描述】:

谁能解释一下这里发生了什么。

我有以下标记:

<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>");

为什么?!

更新

我对这个问题的关注程度感到惊讶!

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

这仍然不能准确解释为什么更改渲染方法的顺序会导致错误消失,但我相信这一切都有一个合乎逻辑的解释!

【问题讨论】:

  • 有趣。他们通常会提到这些东西......
  • 这对我来说是正确的。 (而且我看不出它不应该这样做的原因。)
  • @Mormegil 有趣...一定是我的代码库中的其他东西在干扰它。

标签: c# .net asp.net render


【解决方案1】:

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

<script>this is my script</script>

【讨论】:

  • 没有“覆盖”发生。
【解决方案2】:

在这两种情况下,我都会仔细查看呈现的 HTML。听起来您的脚本可能渲染不正确,这会导致以下 html 无法渲染。更改顺序会更改 html 呈现的顺序,这意味着该错误不会对页面造成太大影响。

【讨论】:

    【解决方案3】:

    以下是正确覆盖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 的缩进层次结构等。

    对于您的具体示例,一个更简单的解决方案 - 如果您不想以编程方式更改 &lt;head&gt; 标签的属性 - 将标签 &lt;head runat="server"&gt; 更改为仅 &lt;head&gt;

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多