有人可以解释一下这里发生了什么。
我有以下标记:
<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(它将脚本移到底部等)。
这仍然无法解释为什么更改渲染方法的顺序会导致错误消失,但我确信这一切都有合理的解释!
答案 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>
。