我正在使用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做任何好事。
例如,如果我想要一个谷歌图表,我将their 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引起的。有没有人遇到过类似的问题或者可以对这个问题有所了解?
答案 0 :(得分:1)
我认为问题不在于google.setOnLoadCallback等,我认为你有一个范围问题。试试这个:
google.setOnLoadCallback(function(){drawChart.call(window)});
这会明确地将drawChart函数的上下文设置为可以访问google变量的内容。
答案 1 :(得分:0)
我找到了解决这个问题的方法,虽然我仍然不知道是什么导致了这个问题。我将我的Google图表代码放入我的主页并将其包装到jQuery函数中,在加载用户控件时调用它。
这导致了另一个问题,即iFrame在Firefox和Chrome中变回空洞(但不是在IE中,奇怪)。 here解决了这个问题。
长话短说,它比我想要的更麻烦,但最终结果是一样的。