为什么这两个代码片段的输出之间存在差异?

时间:2011-11-12 08:30:29

标签: asp.net

摘录1:

<% _message.InnerText = this.GetType().ToString(); %>
<h3>Page type: <span id=_message runat=server/></h3>

摘录2:

<h3>Page type: <span id=_message runat=server/></h3>
<% _message.InnerText = this.GetType().ToString(); %>

1给了我预期的输出,但是2没有给我任何东西。

为什么?

2 个答案:

答案 0 :(得分:1)

正如有人在评论中指出的那样,因为在代码执行之前,span标记已经呈现并传递给浏览器。但是我相信如果你将Response.Buffer标志设置为true,它们的行为都会相同。将这行代码放在页面顶部:

<% Response.Buffer = true; %>

(我只是在这里猜测。我没有对此进行过测试,因为情况是你应该避免开始的。)

有趣的是,我相信你的演示是为什么内联代码只是一个坏主意的许多很好的例子之一。这种方法最终与Web服务器和Web浏览器的行为方式不相符。

答案 1 :(得分:0)

正如Linus所说,“阅读f ***源代码。” 所以我反编译代码并得到了这个:

表示1。

// ASP.default_aspx
private void __Renderform1(HtmlTextWriter __w, Control parameterContainer)
{
    __w.Write("\r\n    ");
    parameterContainer.Controls[0].RenderControl(__w);
    __w.Write("\r\n    start\r\n        <h3>Page type:");
    parameterContainer.Controls[1].RenderControl(__w);
    __w.Write("</h3>\r\n        ");
    this._message.InnerText = base.GetType().ToString();
    __w.Write("\r\n    end\r\n    ");
}

表示2。

// ASP.default_aspx
private void __Renderform1(HtmlTextWriter __w, Control parameterContainer)
{
    __w.Write("\r\n    ");
    parameterContainer.Controls[0].RenderControl(__w);
    __w.Write("\r\n    start\r\n        ");
    this._message.InnerText = base.GetType().ToString();
    __w.Write("\r\n        <h3>Page type:");
    parameterContainer.Controls[1].RenderControl(__w); // Here the change has no effect.
    __w.Write("</h3>\r\n    end\r\n    ");
}

所以,有两个关键点:

  1. ASP.NET解析器以自上而下的方式呈现整个页面 时尚,字面

  2. 我的桌面传统经验引起了混乱 应用

  3. 对于桌面应用,它就像:代码 - &gt;记忆 - &gt; UI

    对于ASP.NET应用程序,它就像:代码 - &gt;存储器 - &gt;输出缓冲器 - &gt; UI

    在代码段2中,代码发生了变化 - &gt;内存步骤,但它没有机会进入输出缓冲区,因此在终极UI上没有任何改变。

    因此,根本原因是在我们到达ASP.NET应用程序的UI之前,我们还有一个额外的阶段。

    我希望我能说清楚。