Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 为什么会有';这两个代码段的输出之间有什么区别?_Asp.net - Fatal编程技术网

Asp.net 为什么会有';这两个代码段的输出之间有什么区别?

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

片段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什么也没有给我


为什么?

正如有人在评论中指出的,这是因为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”);
}
因此,有两个关键点:

  • ASP.NET解析器以从上到下的顺序呈现整个页面 时尚,字面意思是

  • 这种困惑源于我对桌面的传统体验 应用程序

  • 对于桌面应用程序,它类似于:代码->内存->用户界面

    对于ASP.NET应用程序,它类似于:代码->内存->输出缓冲区->用户界面

    在代码片段2中,代码->内存步骤确实发生了更改,但它没有机会将其提交到输出缓冲区,因此在最终用户界面上没有任何更改

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


    我希望我能说清楚。

    这是因为在代码段2中,跨度已经呈现出来了,这就是为什么对该控件所做的任何更改只会在下一次回发时生效,而在代码段1中则相反。Responser.Buffer决定了在完成回发之前缓冲输出的时间。这与页面控件的渲染顺序无关。请尝试编辑您的帖子并回答它。不要更新你问题中的答案。