Хаос при неправильной записи в писатель во время метода Render () - PullRequest
12 голосов
/ 07 июня 2011

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

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

<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

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

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

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

Ответы [ 3 ]

1 голос
/ 10 июня 2011

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

<script>this is my script</script>
0 голосов
/ 08 июля 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();

В противном случае вы можете перепутать *Иерархия отступов 1008 * и т. Д.

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

0 голосов
/ 30 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...