Winform浏览器控件“附件”按钮

时间:2013-04-09 22:46:37

标签: asp.net ajax winforms

我们有一个winform应用程序,它有一个浏览器控件。以前这些文件(总是非常小的10kb等)存储在unc位置。我们将生成一些html并将html加载到浏览器中。如果我们想让这些小文件中的一个可用,我们将在HTML中包含一个锚标记()当html在浏览器控件中显示时,这就是链接。用户可以单击该链接并显示文件另存为对话框。

我们现在将这些文件作为varbinary存储在db中,因此不再有锚标记指向的物理位置。我有几个想法,但希望那些比我聪明的SO成员能够加入。

在我看来,选项1将是一个图像按钮,锚标签,点击html中的内容。我会用javascript或回发来处理“onclick”。这似乎可以用于我的知识水平除了我不知道如何将byte []转换为用户的另存为对话框....我是否先将其渲染到磁盘?

我的另一个想法是在浏览器控件中有一个 NOT 按钮。如果商业规则表示显示文件,则此按钮将隐藏/可见。单击该按钮将生成byte [],该字节很容易转换为文件,并在winform应用程序中显示如图所示的保存对象。

所以任何想法或所有不同的建议都欢迎 TIA JB

1 个答案:

答案 0 :(得分:1)

我了解您可以控制Windows窗体Web浏览器控件中显示的ASP.NET网页,以便您可以编辑该页面并按照您希望的方式构建它。

如果这是真的,托管网页浏览器或正常IE会话中的行为是相同的,我建议在asp.net网页表单页面中创建一堆超链接或按钮,每一个都有一个特定的ID,如要下载的文件的ID。然后你可以创建一个处理程序或button_click事件处理程序,你可以通过点击的按钮/链接相关文件Id获取文件的byte [],或者如果你启动了一个处理程序调用,则从查询字符串获取,然后你开始向下流式传输浏览器的文件内容,浏览器将完成您所需要的一切。

例如,作为一个起点,从这里获取一些代码:http://social.msdn.microsoft.com/Forums/en-US/silverlightnet/thread/d6a5087f-43b1-4782-95f1-d1376130d2c8

向您展示了从页面加载中执行此操作的可能方法,诀窍是对GetDocument的调用为您获取了正确的文件内容(在本例中来自查询字符串,想象就像我们在里面处理程序处理方法)并返回包含字节的类DocumentInfo。你不需要这个DocumentInfo,你可以有一个按文件ID返回byte[]的方法,例如......

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        string queryString = this.Request.QueryString.ToString();
        if (string.IsNullOrEmpty(queryString)) return;

        DocumentInfo documentInfo = GetDocument(queryString);

        if (!documentInfo.HasValue) return;

        Response.ClearHeaders();
        Response.ClearContent();

        Response.AppendHeader("Content-Length", documentInfo.Value.Content.Length.ToString());

        Response.ContentType = "application/octet-stream";

        Response.AppendHeader("Content-Disposition", "attachment; filename=Test.doc");

        Response.BinaryWrite(documentInfo.Value.Content);

        Response.End();
    }
}