我正在使用 HTMLTextWriter 和 StringWriter 的组合来呈现我的用户控件。用于呈现用户控件的代码是通过我页面上的一些 Javascript 的 ajax 调用启动的。生成的 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 做任何好事。
例如,如果我想要一个谷歌图表,我将他们的 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 Charts——我在 Twitter Search API 和其他方面也遇到过类似的问题。此外,将行
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
放在我的默认或母版页中没有区别。
最后,如果在设计时使用通常的@Register 指令将用户控件添加到我的母版页,则此代码将毫无问题地工作 - 让我相信问题是由 StringWriter 引起的。有没有人遇到过类似的问题,或者可以对这个问题有所了解?