Ответ 1
Вы просто переписываете содержимое своего тела тем, что вы возвращаете из своей функции:
<script>this is my script</script>
Не могли бы вы объяснить, что здесь происходит.
У меня есть следующая разметка:
<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 приведет к исчезновению ошибки, но я уверен, что для этого есть логическое объяснение!
Вы просто переписываете содержимое своего тела тем, что вы возвращаете из своей функции:
<script>this is my script</script>
Я бы внимательно посмотрел на визуализированный HTML в обоих случаях. Похоже, что ваш script может быть неправильно рендерингом, что приведет к тому, что следующий html не сможет отобразить. Изменение порядка изменяет порядок рендеринга html, что означает, что ошибка не влияет на большую часть страницы.
Вот как правильно переопределить метод 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>
.