#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 ключевых момента:
-
The ASP.NET анализатор отображает всю страницу сверху вниз, буквально.
-
Путаница возникает из-за моего традиционного опыта работы с настольным приложением.
Для настольных приложений это выглядит так: Код -> Память -> пользовательский интерфейс
Для ASP.NET приложения, это как: Код -> Память -> Буфер вывода-> Пользовательский интерфейс
Во фрагменте 2 изменение действительно происходит для Code -> Memory step, но у него не было возможности перейти в выходной буфер, и, следовательно, в ultimate UI ничего не изменилось.
Итак, основная причина в том, что у нас есть дополнительный этап, прежде чем мы достигнем пользовательского интерфейса для ASP.NET приложения.
Надеюсь, я ясно выразился.
Комментарии:
1. Попробуйте отредактировать свой пост и ответить на него. Не обновляйте ответ в своем вопросе.