В чем разница между выводом этих 2 фрагментов кода?

#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 = this.GetType().ToString(); %>
  

1 дает мне ожидаемый результат, но 2 ничего не дает.

Почему?

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

1. это потому, что во фрагменте 2 диапазон УЖЕ отрисован, поэтому любые изменения, внесенные в этот элемент управления, вступят в силу только при следующей обратной передаче, в то время как во фрагменте 1 все наоборот.

Ответ №1:

Как кто-то указал в комментариях, это потому, что тег span уже отрисован и доставлен в браузер до выполнения вашего кода. Однако я полагаю, что если вы зададите ответ.Присвоите буферу значение true, они оба будут вести себя одинаково. Разместите эту строку кода вверху вашей страницы:

 <% Response.Buffer = true; %>
  

(Здесь я просто предполагаю. Я не тестировал это, потому что ситуация из тех, которых вам следует избегать с самого начала.)

Интересно, что я считаю вашу демонстрацию одним из многих замечательных примеров того, почему встроенный код — это просто плохая идея. Это подход, который в конечном счете плохо согласуется с тем, как ведут себя веб-серверы и веб-браузеры.

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

1. Responser.Buffer определяет, следует ли буферизировать вывод до тех пор, пока не будет готов полный ответ. Это не имеет отношения к последовательности отображения элементов управления страницей.

Ответ №2:

Как и сказал Лайнус, «Прочитайте гребаный исходный код». Итак, я декомпилировал код и получил это:

для 1.

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

для 2.

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

Итак, есть 2 ключевых момента:

  1. The ASP.NET анализатор отображает всю страницу сверху вниз, буквально.

  2. Путаница возникает из-за моего традиционного опыта работы с настольным приложением.

Для настольных приложений это выглядит так: Код -> Память -> пользовательский интерфейс

Для ASP.NET приложения, это как: Код -> Память -> Буфер вывода-> Пользовательский интерфейс

Во фрагменте 2 изменение действительно происходит для Code -> Memory step, но у него не было возможности перейти в выходной буфер, и, следовательно, в ultimate UI ничего не изменилось.

Итак, основная причина в том, что у нас есть дополнительный этап, прежде чем мы достигнем пользовательского интерфейса для ASP.NET приложения.

Надеюсь, я ясно выразился.

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

1. Попробуйте отредактировать свой пост и ответить на него. Не обновляйте ответ в своем вопросе.