Почему Response.Запись отображается перед элементами управления на странице?

#asp.net

#asp.net

Вопрос:

Почему в этом коде текст для response.write отображается перед текстом в метке? Вот код, лежащий в основе:

 protected void Page_Load(object sender, EventArgs e)
{
    HttpRequest request = Request;
    if (request.QueryString["game"] == "cstrike") Label1.Text = "15000 $";
    if (request.QueryString["game"] == "diablo3") Label1.Text = "25000 $";
    if (request.QueryString["game"] == "pes2012") Label1.Text = "30000 $";
    if (request.QueryString["game"] == "splinterCellConviction") Label1.Text = "75000 $";
    Response.Write("<span>Query:<span>"   request.QueryString.ToString());
} 
  

Например, вывод выглядит так:

Запрос: game=cstrike 15000 $

почему он выводится в таком порядке? «Элемент управления меткой asp» находится над всеми элементами управления на странице :

Я ожидал, что результат будет выглядеть так :

Запрос на 15000 $: game=cstrike

вот asp.net код страницы спереди:

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Pricing.aspx.cs" Inherits="queryStringPlay.Pricing" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    </div>

    </form>
</body>
</html>
  

Ответ №1:

Обычный рендеринг страницы вытесняется вашим вызовом response.write . Вот порядок событий в asp.net http://msdn.microsoft.com/en-us/library/ms178472.aspx

Ваш вызов response.write в основном говорит: «продолжайте и запишите это значение в поток, не дожидаясь завершения остальной части конвейера рендеринга». Я считаю, что это плохой тон и что вы должны поместить литерал на страницу, содержащую значение 15000 $. Затем пусть ваш код просто установит текстовое значение этого литерала.

Ответ №2:

Компилятор делает все, что вы ему говорите… вы можете убедиться в этом, пройдясь по коду в отладчике… в этом случае вы используете Response.Write , и это отправляется клиенту… то, что вы делали раньше, не отправляется клиенту, потому что, используя Response.Write , вы в основном сообщаете ASP.NET время выполнения, чтобы «игнорировать» их!

Что именно должен выполнять этот код?

Комментарии:

1. Это не обратный порядок, вы получаете вещи в том порядке, в котором вы их запрашивали (запись ответа во время загрузки и рендеринг остальной части страницы во время рендеринга).