Подтвердить что ты не робот

Хаос при неправильном написании записи во время метода 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>

Решение заключается в вызове writer.Write после base.Render, вот так:

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

Почему?

UPDATE

Я удивлен количеством интересующих вас вопросов!

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

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

4b9b3361

Ответ 1

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

<script>this is my script</script>

Ответ 2

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

Ответ 3

Вот как правильно переопределить метод 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>.