Хаос при неправильной записи в райтер во время метода Render()

Может кто-нибудь объяснить, что здесь происходит.

У меня есть следующая разметка:

<html>
<head runat="server">
    <title>My title</title>
    <my:MyControl runat="server" ID="myControl" />
</head>
...

Мой пользовательский элемент управления выглядит примерно так:

public MyControl : Control
{
    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write("<script>this is my script</script>");
        base.Render(writer);
    }
}

При рендеринге страницы вся верхняя половина заголовка обрезается, поэтому html рендерится так:

<html>
    <script>this is my script</script>
</head>

Решение состоит в том, чтобы вызвать write.Write после base.Render, например:

base.Render(writer);
writer.Write("<script>this is my script</script>");

Почему?!

ОБНОВЛЕНИЕ

Я удивлен интересом к этому вопросу!

Я узнал, почему удалялась верхняя часть моего тега head - это была ошибка с HttpHandler, который я использую для «чистки» html (он перемещает скрипты вниз и т. д.).

Это все еще не объясняет точно, почему изменение порядка метода рендеринга приведет к исчезновению ошибки, но я уверен, что всему этому есть логическое объяснение!


person cbp    schedule 07.06.2011    source источник
comment
Немного? msdn.microsoft.com/en-us/ библиотека/   -  person cbp    schedule 07.06.2011
comment
Интересный. Обычно они упоминают о таких вещах...   -  person leppie    schedule 07.06.2011
comment
Это работает для меня правильно. (И я не вижу причин, почему это не должно быть.)   -  person Mormegil    schedule 07.06.2011
comment
@Mormegil Интересно ... должно быть что-то еще в моей кодовой базе, что его тогда беспокоит.   -  person cbp    schedule 07.06.2011


Ответы (3)


Вы просто перезаписываете содержимое своего тела тем, что возвращаете из своей функции:

<script>this is my script</script>
person Adrian    schedule 10.06.2011
comment
Перезаписи не происходит. - person Kirk Woll; 10.06.2011

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

person Schroedingers Cat    schedule 30.06.2011

Вот как правильно переопределить метод Control.Render(HtmlTextWriter writer). Прокрутите вниз до раздела «Примеры»: http://msdn.microsoft.com/en-us/library/system.web.ui.htmltextwriter.aspx

Существенная часть

        // Create a non-standard markup element.
        writer.RenderBeginTag("MyTag");
        writer.Write("Contents of MyTag");
        writer.RenderEndTag();
        writer.WriteLine();

В противном случае вы можете перепутать иерархию отступов HtmlTextWriter и т. д.

Более простое решение для вашего конкретного примера - если вы не хотите программно изменять атрибуты тега <head> - было бы изменить тег <head runat="server"> только на <head>.

person oleschri    schedule 07.07.2011