2012-09-11 35 views
2

我有一个需求来创建一个HTML表格并将其作为电子表格发送给用户。我在普通的旧ASP.NET中做了很多次,但是它在SharePoint中踢我的背后。它是一个带有事件处理程序的简单按钮,它调用存储在模块中的3个文件(可通过沙盒解决方案访问),然后尝试将文本推送给用户以及适当的内容类型和内容处置。当我得到这部分工作时,SampleData.txt部分将被来自多个列表的数据替换。不幸的是,该页面是回发,但没有文件提供给用户打开或下载。如何从沙盒解决方案获取Response.Write?

我读过几个地方的Response.Write在Web部件中不可用,但肯定还有其他一些方法来完成这个任务...?这就是我想要做的 - 有没有可用的替代方案?

protected override void CreateChildControls() 
    { 
     Button ReportButton = new Button(); 
     ReportButton.Text = "Generate DCPDS Report"; 
     ReportButton.Click += new EventHandler(ReportButton_Click); 
     this.Controls.Add(ReportButton); 
    } 

    protected void ReportButton_Click(Object sender, EventArgs e) 
    { 
     string header = ""; 
     string sampleData = ""; 
     string footer = ""; 

     using (SPWeb webRoot = SPContext.Current.Site.RootWeb) 
     { 
      header = webRoot.GetFileAsString("SpreadsheetParts/Header.txt"); 
      sampleData = webRoot.GetFileAsString("SpreadsheetParts/SampleData.txt"); 
      footer = webRoot.GetFileAsString("SpreadsheetParts/Footer.txt"); 
     } 

     StringBuilder sb = new StringBuilder(); 
     sb.Append(header); 
     sb.Append(sampleData); 
     sb.Append(footer); 

     Page.Response.Clear(); 
     HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; 
     HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=June2010Spreadsheet.xls"); 
     HttpContext.Current.Response.Write(sb.ToString()); 
     //HttpContext.Current.Response.End(); 
    } 

回答

1

我没有测试过这一点,这将使概念的一个有趣的证明,但我没有任何处女的SharePoint 2010和服务器准备好进行测试,所以我不能测试这个给你。但就像一个想法,你能不能把你的Excel工作表中的内容在一个隐藏字段,这样做:

HTML:

<script type="text/javascript"> 
    function downloadExcel() { 
     location.href='data:application/download,' + encodeURIComponent(
     document.getElementById('<%= hfExcelData.ClientID %>').value 
    ); 
    } 
</script> 

C#:

protected override void CreateChildControls() 
{ 
    Button ReportButton = new Button(); 
    ReportButton.Text = "Generate DCPDS Report"; 
    ReportButton.Click += new EventHandler(ReportButton_Click); 
    this.Controls.Add(ReportButton); 
} 

protected void ReportButton_Click(Object sender, EventArgs e) 
{ 
    string header = ""; 
    string sampleData = ""; 
    string footer = ""; 

    using (SPWeb webRoot = SPContext.Current.Site.RootWeb) 
    { 
     header = webRoot.GetFileAsString("SpreadsheetParts/Header.txt"); 
     sampleData = webRoot.GetFileAsString("SpreadsheetParts/SampleData.txt"); 
     footer = webRoot.GetFileAsString("SpreadsheetParts/Footer.txt"); 
    } 

    StringBuilder sb = new StringBuilder(); 
    sb.Append(header); 
    sb.Append(sampleData); 
    sb.Append(footer); 

    this.hfExcelData.value = sb.ToString(); 

    Page.ClientScript.RegisterStartupScript(this.GetType(), "ExcelUploader", "downloadExcel();", true) 

} 
+0

我正在它的页面 - 这似乎是一个有用的想法,但的RegisterStartupScript没有工作,也没有内嵌的ClientID。我已经修改了的javascript如下: $(文件)。就绪(函数(){ \t变种练成=的document.getElementById( 'ctl00_m_g_522f74a4_8de0_4319_b8d2_6e40e4e63600_hfExcelData'); \t如果(EXCEL && excel.value.length> 0) {encodeURIComponent(excel.value); \t} }); 到目前为止,它不工作,但我还没有通过!只是想让你知道我没有理睬你。谢谢! – Charlie

+0

Midlothian,呃?我们几乎都是兄弟。我住在斯塔福德县。 – Charlie

+0

小世界!我很惊讶,内联ClientID不起作用,更令人惊讶的是,RegisterStarupScript不起作用。你的控件/页面上可能有UpdatePanel吗? –

0

我米与类似的挣扎。我的理解是,在沙盒中,SP实际上代理了对你的页面的调用,获得响应,然后将它自己的响应返回给客户端。该代理不允许HttpContext或SP类的所有功能。在我的测试中,ContentType和头文件不会被返回。 SP(在沙盒代码中)将始终返回text/html,并忽略Web部件中的其他任何内容。

获取HTML的一种方法就是使用asp:literal。您可以按照these steps创建一个带有Web部件的应用程序页面。删除主页面引用和占位符,以便只返回是您的web部件内容。在Web部件中,添加文字并将文本设置为HTML表格。此时,您将有一个页面,只是将表格返回为HTML。这里是another post outlining the exact technique。但是,您仍然无法更改内容类型或添加标题。 也许结合第一个答案,会让你的解决方案,虽然?

0

使用按钮或链接按钮上的默认JavaScript功能 STSNavigate(dUrl);

调用创建的HttpContext.Current.Response

相关问题