Asp.net 为什么会有';这两个代码段的输出之间有什么区别?
片段1:Asp.net 为什么会有';这两个代码段的输出之间有什么区别?,asp.net,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 = th
<% _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什么也没有给我
为什么?正如有人在评论中指出的,这是因为span标记在代码执行之前已经呈现并交付到浏览器。但是,我相信如果您将Response.Buffer标志设置为true,它们的行为将相同。将这行代码放在页面顶部:
<% Response.Buffer = true; %>
(我只是在这里猜测。我没有测试过这一点,因为这种情况一开始就应该避免。)
有趣的是,我相信您的演示是解释内联代码为何是一个坏主意的众多优秀示例之一。这是一种最终与web服务器和web浏览器的行为方式不匹配的方法。正如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 ");
}
//ASP.default\u aspx
私有void\uu Renderform1(HtmlTextWriter\uu w,控制参数容器)
{
__w、 写入(“\r\n”);
parameterContainer.Controls[0].RenderControl(\uw);
__w、 写入(“\r\n开始\r\n页面类型:”);
parameterContainer.Controls[1].RenderControl(\uw);
__w、 写入(“\r\n”);
此._message.InnerText=base.GetType().ToString();
__w、 写入(“\r\n结束\r\n”);
}
两个人
// 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 ");
}
//ASP.default\u aspx
私有void\uu Renderform1(HtmlTextWriter\uu w,控制参数容器)
{
__w、 写入(“\r\n”);
parameterContainer.Controls[0].RenderControl(\uw);
__w、 写入(“\r\n开始\r\n”);
此._message.InnerText=base.GetType().ToString();
__w、 写入(“\r\n页面类型:”);
parameterContainer.Controls[1].RenderControl(_w);//此处的更改无效。
__w、 写入(“\r\n结束\r\n”);
}
因此,有两个关键点:
我希望我能说清楚。这是因为在代码段2中,跨度已经呈现出来了,这就是为什么对该控件所做的任何更改只会在下一次回发时生效,而在代码段1中则相反。Responser.Buffer决定了在完成回发之前缓冲输出的时间。这与页面控件的渲染顺序无关。请尝试编辑您的帖子并回答它。不要更新你问题中的答案。