Вопрос

I am working on a project where HTML code is being generated to display graphs generated by Google's visualization API. So when the page loads it creates an HTML snippet that has the HTML code to display the graphs. What I would like to do is take this raw HTML code and load it into an iframe so it can be displayed on the page. In .NET is there a way to fill an iframe on button click with raw HTML code?

VB CODE:
public html as String

 Sub Page_Load(Src As Object, E As EventArgs)

 Dim htmlHeader As String = "<!DOCTYPE html PUBLIC " & Chr(34) & "-//W3C//DTD XHTML 1.0 Transitional//EN" & Chr(34) & "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" & Chr(34) & "><html xmlns=" & Chr(34) & "http://www.w3.org/1999/xhtml" & Chr(34) & "><head><meta http-equiv=" & Chr(34) & "Content-Type" & Chr(34) & " content=" & Chr(34) & "text/html; charset=utf-8" & Chr(34) & " /><title>Test</title>" & Chr(60) & "script type = " & Chr(34) & "text/javascript" & Chr(34) & " src = " & Chr(34) & "http://canvg.googlecode.com/svn/trunk/canvg.js" & Chr(34) & ">" & Chr(60) & "/script>" & Chr(60) & "script type = " & Chr(34) & "text/javascript" & Chr(34) & " src = " & Chr(34) & "http://canvg.googlecode.com/svn/trunk/rgbcolor.js" & Chr(34) & ">" & Chr(60) & "/script></head><body>"
 Dim htmlFooter As String = Chr(60) & "div>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart1_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart2_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart3_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart4_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart5_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "div style=" & Chr(34) & "clear:both" & Chr(34) & ">" & Chr(60) & "/div></div></body></html>"
 Dim htmlChartheader As String = Chr(60) & "script src=" & Chr(34) & "https://www.google.com/jsapi" & Chr(34) & " type=" & Chr(34) & "text/javascript" & Chr(34) & ">" & Chr(60) & "/script>" & Chr(60) & "script type=" & Chr(34) & "text/javascript" & Chr(34) & ">   /*CACHARTS*/   google.load(" & Chr(34) & "visualization" & Chr(34) & ", " & Chr(34) & "1" & Chr(34) & ", {packages:[" & Chr(34) & "corechart" & Chr(34) & "]});   google.setOnLoadCallback(drawChart);   function drawChart() {    var data;    var chart;"
 Dim htmlChartfooter As String = " window.scroll(0,0);  } " & Chr(60) & "/script>"
 Dim htmlChart1 As String = ""
 Dim htmlChart2 As String = ""
 Dim htmlChart3 As String = ""
 Dim htmlChart4 As String = ""
 Dim htmlChart5 As String = ""
 Dim dataPoints As String = ""
 Dim qCount As Integer = 0          

 dataPoints += "data.setValue(" & qCount & ",0,'" & "Q1" & "'); "
 dataPoints += "data.setValue(" & qCount & ",1," & "141000" & "); "
 qCount += 1
 dataPoints += "data.setValue(" & qCount & ",0,'" & "Q2" & "'); "
 dataPoints += "data.setValue(" & qCount & ",1," & "151000" & "); "
 qCount += 1
 dataPoints += "data.setValue(" & qCount & ",0,'" & "Q3" & "'); "
 dataPoints += "data.setValue(" & qCount & ",1," & "161000" & "); "
 qCount += 1
 dataPoints += "data.setValue(" & qCount & ",0,'" & "Q4" & "'); "
 dataPoints += "data.setValue(" & qCount & ",1," & "145000" & ");"                      

 htmlChart1 = "document.getElementById('chart1_div').scrollIntoView();chartTitle = 'Regular & REO Average Sold Price';   xColumn = 'Quarter';   yColumn = 'Avg Sold Price';   zColumn = 'Smoothed';   yTitle = 'Price in Thousands';   chart = new google.visualization.LineChart(document.getElementById('chart1_div'));   legendType = 'none';   data = new google.visualization.DataTable();   data.addColumn('string', xColumn);   data.addColumn('number', yColumn);   data.addColumn('number', zColumn);   data.addRows(10); " & dataPoints & "chart.draw(data, {title: chartTitle ,vAxis:{title: yTitle} ,width: 500, height: 500 ,hAxis:{slantedText:true, slantedTextAngle:90, textStyle:{fontSize:10}} ,curveType:'function' ,lineWidth:1 ,pointSize:1 ,legend:'none' ,legend: legendType   }); "          
    html = htmlHeader & htmlChartheader & htmlChart1 & htmlChartfooter & htmlFooter         
    textbox1.text = html     
 End sub

 Sub Button1_Click(Byval sender as object,Byval e as EventArgs)
   filliFrame(html)
 End Sub

 Sub filliFrame(htmlcode as String)
   This is where I would like to write the HTML to the iFrame
   ?? iframe.write(htmlcode) ??
 End Sub 
Это было полезно?

Решение

I was able to accomplish this by storing the html code into a hidden field and using a JavaScript function to push the code to the iFrame.

VB CODE:

Sub Page_Load(Src As Object, E As EventArgs)
  Dim html as String = ""
  Dim htmlHeader As String = "<!DOCTYPE html PUBLIC " & Chr(34) & "-//W3C//DTD XHTML 1.0 Transitional//EN" & Chr(34) & "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" & Chr(34) & "><html xmlns=" & Chr(34) & "http://www.w3.org/1999/xhtml" & Chr(34) & "><head><meta http-equiv=" & Chr(34) & "Content-Type" & Chr(34) & " content=" & Chr(34) & "text/html; charset=utf-8" & Chr(34) & " /><title>Test</title>" & Chr(60) & "script type = " & Chr(34) & "text/javascript" & Chr(34) & " src = " & Chr(34) & "http://canvg.googlecode.com/svn/trunk/canvg.js" & Chr(34) & ">" & Chr(60) & "/script>" & Chr(60) & "script type = " & Chr(34) & "text/javascript" & Chr(34) & " src = " & Chr(34) & "http://canvg.googlecode.com/svn/trunk/rgbcolor.js" & Chr(34) & ">" & Chr(60) & "/script></head><body>"
  Dim htmlFooter As String = Chr(60) & "div>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart1_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart2_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart3_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart4_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "span class=" & Chr(34) & "float-left" & Chr(34) & " id=" & Chr(34) & "chart5_div" & Chr(34) & ">" & Chr(60) & "/span>" & Chr(60) & "div style=" & Chr(34) & "clear:both" & Chr(34) & ">" & Chr(60) & "/div></div></body></html>"
  Dim htmlChartheader As String = Chr(60) & "script src=" & Chr(34) & "https://www.google.com/jsapi" & Chr(34) & " type=" & Chr(34) & "text/javascript" & Chr(34) & ">" & Chr(60) & "/script>" & Chr(60) & "script type=" & Chr(34) & "text/javascript" & Chr(34) & ">   /*CACHARTS*/   google.load(" & Chr(34) & "visualization" & Chr(34) & ", " & Chr(34) & "1" & Chr(34) & ", {packages:[" & Chr(34) & "corechart" & Chr(34) & "]});   google.setOnLoadCallback(drawChart);   function drawChart() {    var data;    var chart;"
  Dim htmlChartfooter As String = " window.scroll(0,0);  } " & Chr(60) & "/script>"
  Dim htmlChart1 As String = ""
  Dim dataPoints As String = ""
  Dim qCount As Integer = 0          

  dataPoints += "data.setValue(" & qCount & ",0,'" & "Q1" & "'); "
  dataPoints += "data.setValue(" & qCount & ",1," & "141000" & "); "
  qCount += 1
  dataPoints += "data.setValue(" & qCount & ",0,'" & "Q2" & "'); "
  dataPoints += "data.setValue(" & qCount & ",1," & "151000" & "); "
  qCount += 1
  dataPoints += "data.setValue(" & qCount & ",0,'" & "Q3" & "'); "
  dataPoints += "data.setValue(" & qCount & ",1," & "161000" & "); "
  qCount += 1
  dataPoints += "data.setValue(" & qCount & ",0,'" & "Q4" & "'); "
  dataPoints += "data.setValue(" & qCount & ",1," & "145000" & ");"                      

  htmlChart1 = "document.getElementById('chart1_div').scrollIntoView();chartTitle = 'Regular & REO Average Sold Price';   xColumn = 'Quarter';   yColumn = 'Avg Sold Price';   zColumn = 'Smoothed';   yTitle = 'Price in Thousands';   chart = new google.visualization.LineChart(document.getElementById('chart1_div'));   legendType = 'none';   data = new google.visualization.DataTable();   data.addColumn('string', xColumn);   data.addColumn('number', yColumn);   data.addColumn('number', zColumn);   data.addRows(10); " & dataPoints & "chart.draw(data, {title: chartTitle ,vAxis:{title: yTitle} ,width: 500, height: 500 ,hAxis:{slantedText:true, slantedTextAngle:90, textStyle:{fontSize:10}} ,curveType:'function' ,lineWidth:1 ,pointSize:1 ,legend:'none' ,legend: legendType   }); "          

  html = htmlHeader & htmlChartheader & htmlChart1 & htmlChartfooter & htmlFooter
  lblhtmlholder.text = html        
End sub



Sub Button1_Click(Byval sender as object,Byval e as EventArgs) 
  hdnTextbox1.Value = lblhtmlholder.text
  filliFrame()
End Sub

Sub filliFrame()
  Page.ClientScript.RegisterStartupScript(Me.GetType(), "myKey", "injectHTML();", True) 
End Sub

HTML CODE:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <script type = "text/javascript" src = "//canvg.googlecode.com/svn/trunk/canvg.js"></script>
  <script type = "text/javascript" src = "//canvg.googlecode.com/svn/trunk/rgbcolor.js"></script>
  <script type = "text/javascript">
    function injectHTML(){

    //step 1: get the DOM object of the iframe.
    var iframe = document.getElementById('iFrame1');        
    var html_string = document.getElementById("hdnTextbox1").value
    document.getElementById("hdnTextbox1").value = ""

    try{                
      //step 2: obtain the document associated with the iframe tag
      //most of the browser supports .document. Some supports (such as the NetScape series) .contentDocumet, while some (e.g. IE5/6) supports .contentWindow.document
      //we try to read whatever that exists.
      var iframedoc = iframe.document;
      if (iframe.contentDocument)
        iframedoc = iframe.contentDocument;
      else if (iframe.contentWindow)
        iframedoc = iframe.contentWindow.document;

        if (iframedoc){
          // Put the content in the iframe
          iframedoc.open();
          iframedoc.writeln(html_string);
          iframedoc.close();
        } else {
          //just in case of browsers that don't support the above 3 properties.
          alert('Cannot inject dynamic contents into iframe.');
        }                           
      }
      catch(err)
      {
        alert(err.message);
      }      
    }
  </script>
</head>
<body>
  <form id="form1" runat="server">
    <asp:label id="lblHtmlHolder" runat="server" visible="false" />
    <input type="hidden" id="hdnTextbox1" runat="server" />
    <input type="hidden" id="hdnChart1" runat="server" />
    <asp:Button ID="button1" runat="server" Text="Fill iFrame" OnClick="Button1_Click" />
    <iframe id="iFrame1" runat="server" style="width:700px; height:400px;" />
  </form>       
</body>
</html>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top