1

我正在使用 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 引起的。有没有人遇到过类似的问题,或者可以对这个问题有所了解?

4

2 回答 2

1

我认为问题不在于 google.setOnLoadCallback 等,我认为您在那里有范围界定问题。试试这个:

google.setOnLoadCallback(function(){drawChart.call(window)});

这会将 drawChart 函数的上下文显式设置为可以访问 google 变量的内容。

于 2011-06-23T14:54:40.360 回答
0

我找到了解决该问题的方法,尽管我仍然不知道是什么原因造成的。我将我的 Google 图表代码放入我的主页中,并将其包装到一个 jQuery 函数中,在加载用户控件时调用它。

这导致了另一个问题,即 iFrame 在 Firefox 和 Chrome 中返回为空(但奇怪的是,在 IE 中没有)。此处已解决此问题。

长话短说,它比我想要的更混乱,但最终结果是一样的。

于 2011-06-24T18:53:37.157 回答