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 が原因であると思われます。誰かが同様の問題を経験したことがありますか、それとも主題に光を当てることができますか?