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 で何か良いことをしようとするまで、正常に動作しているように見えるユーザー コントロールが返されます。

たとえば、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 is undefined」というエラーが表示されます。

これは 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 関数にラップして、ユーザー コントロールが読み込まれたときにそれを呼び出しました。

これにより、Firefox と Chrome で iFrame が空に戻るというさらなる問題が発生しました (奇妙なことに、IE ではそうではありません)。この問題はここで対処されました。

要するに、私が望んでいたよりも厄介ですが、最終的な結果は同じです.

于 2011-06-24T18:53:37.157 に答える