Я использую комбинацию HTMLTextWriter и StringWriter для визуализации моих пользовательских элементов управления. Код, используемый для визуализации пользовательского элемента управления, инициируется посредством вызова ajax из некоторого Javascript на моей странице. Полученный текст StringWriter возвращается в код javascript и добавляется на мою страницу. Код рендеринга выглядит так:
Dim sw As New System.IO.StringWriter
If Not IsDBNull(reader.Item("UserControlName")) Then
'Use Reflection to create the appropriate class.
'First get the type
'The usercontrol name is retrieved from my datatable reader
Dim htmlcontroltype = Type.GetType("MyProject." & reader.Item("UserControlName"))
If Not IsNothing(htmlcontroltype) Then
'Create an instance of the class
Dim htmlcontrol = Activator.CreateInstance(htmlcontroltype)
htmlcontrol = htmlcontrol.LoadControl("~/" & reader.Item("UserControlName") & ".ascx")
htmlcontrol.DataBind()
Dim tw As New HtmlTextWriter(sw)
htmlcontrol.RenderControl(tw)
Else
sw.Write("No matching User Control was found in the project.")
End If
End If
Return sw.ToString
Это вернет мой пользовательский элемент управления, который, кажется, работает нормально, пока я не попытаюсь сделать что-нибудь хорошее с Javascript.
Если, например, я хочу иметь диаграмму Google, я вставляю их Javascript в мой пользовательский контроль. Вот так:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="TestControl.ascx.vb" Inherits="MyProject.TestControl" %>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
google.load("visualization", "1", { packages: ["corechart"] });
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = new google.visualization.DataTable();
[ -- snip! -- ]
var chart = new google.visualization.LineChart(document.getElementById('visualization1'));
chart.draw(data, { width: 300, height: 250, title: 'Company Performance' });
}
</script>
<div id="visualization1" style="width: 300px; height: 300px;"></div>
Но! Когда я запускаю программу, она выдает ошибку, утверждая, что «Google не определен».
Важно отметить, что это не ограничивается Google Charts - у меня были аналогичные проблемы с Twitter Search API и другими. Кроме того, размещение строки <script src="http://www.google.com/jsapi" type="text/javascript"></script>
на моей странице по умолчанию или на главной странице не имеет значения.
Наконец, этот код будет работать без проблем, если пользовательский элемент управления добавлен на мою главную страницу во время разработки с использованием обычной директивы @Register, что заставляет меня думать, что проблема вызвана StringWriter. Кто-нибудь сталкивался с подобной проблемой или может пролить свет на эту тему?