0

我正在通过我的网络应用程序提供一个 docx 文件。这是为了响应 DropDownList 索引的更改而完成的,我将 AutoPostBack 设置为 true。我有许多可以通过复选框选择的选项,当下拉列表更改时,创建的文件基于选中的选项。

所以我正在做的是当事件触发时我会做一些魔术来创建一个文档然后提供它:

Protected Sub myDropDown_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles myDropDown.SelectedIndexChanged

' a bunch of things happen here but the end result is the contents of a docx file in a MemoryStream with the
' name mainStream

'here is where I set up the response and serve the file:

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("content-disposition", "attachment; filename=document.docx")
Response.ContentEncoding = System.Text.Encoding.UTF8
Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
mainStream.WriteTo(Response.OutputStream)
mainStream.Close()
mainStream.Dispose()
Response.End()

现在我的问题是,此时我该怎么办?看来我必须调用 Response.End() 发送缓冲的内容,但这让我坐在一个页面上,选中了复选框,我的下拉列表显示了已更改的选项。如果我点击页面上导致回发的任何其他按钮,似乎我的下拉列表的选定索引更改事件再次触发。

我想做的是在发送文件后重定向。Response.redirect 将不起作用,因为 Response.End() 停止页面执行。谁能告诉我这种情况通常是如何处理的?谁能告诉我,如果页面上的另一个控件在提供文件后进行回发,为什么我的下拉菜单的选定索引事件会再次触发?任何建议都非常感谢。谢谢!

4

1 回答 1

1

有几种不同的方法可以解决这个问题,具体取决于应用程序的复杂性和选择后页面中所需的行为。

我们处理这种情况的方法是收集所有用于在 javascript 中生成文件的详细信息,并将它们以查询字符串的形式传递给我们在新窗口中从 javascript 打开的 ashx 页面。然后 ashx 页面将生成文件并将响应流回给用户。

我们采用这种方法是因为对文件的请求不会改变用户与页面交互的任何内容。

另一种方法是在回发期间生成文件并将其保存在临时位置。然后,您可以将用户移动到不同的页面或更新当前页面,然后执行一些将为用户获取文件的 javascript。如果文件是在暴露的文件夹中生成的,你可以直接打开文件,如果不是,你可以使用上面的 ashx 技巧。在任何一种情况下,您的代码都必须在隐藏字段或 javascript 中包含对生成文件的引用,以便客户端知道如何找到它。

于 2012-07-25T18:42:26.417 回答