如何使用沙盒解决方案响应.Write?

时间:2012-09-11 16:56:21

标签: sharepoint web-parts response.write

我需要创建一个HTML表格并将其作为电子表格发送给用户。我已经在普通的旧ASP.NET中多次完成了这项工作,但它在SharePoint中扼杀了我。它是一个带有事件处理程序的简单Button,它调用存储在模块中的3个文件(可通过沙盒解决方案访问),然后尝试将文本与适当的内容类型和内容处置一起推送给用户。当我使这部分工作时,SampleData.txt部分将被替换为来自多个列表的数据。不幸的是,该页面进行了回发,但没有提供给用户打开或下载的文件。

我在一些地方读到Response.Write在网页部件中无法使用,但肯定有其他方法可以完成这项任务......?这就是我想做的事 - 有没有可用的选择?

    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();
    }

3 个答案:

答案 0 :(得分: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)

}

答案 1 :(得分:0)

我正在努力与类似。我的理解是,在沙箱中,SP实际上是代理对页面的调用,获取响应,然后将其自己的响应返回给客户端。该代理不允许HttpContext或SP类的所有功能。在我的测试中,不返回ContentType和标头。 SP(在沙盒代码中)将始终返回text / html并忽略webpart中的任何其他内容。

获取所需内容的 HTML 部分的一种方法是使用asp:literal。您可以按照these steps创建一个包含webpart的应用程序页面。删除母版页引用和占位符,以便返回的事物是您的webpart内容。在webpart中,添加文字并将文本设置为HTML表。此时,您将拥有一个将表作为HTML返回的页面。这是another post outlining the exact technique。但是,您仍然无法更改内容类型或添加标头。 也许结合第一个可以为您提供解决方案的答案?

答案 2 :(得分:0)

在按钮或链接按钮上使用默认的javascript函数 STSNavigate(DURL);

调用创建HttpContext.Current.Response

的页面