更新
给出的大多数答案只是将返回的文档注入页面的html中的一些方法,但这似乎不起作用。如果您可以看到aspx代码在做什么之后可能会有所帮助:
Try
RenderDocument = Session("docSelected")
If Not String.IsNullOrEmpty(Request.QueryString("download")) Then
asDownload = CBool(Request.QueryString("download"))
End If
If RenderDocument IsNot Nothing Then
Dim docBytes() As Byte
Dim docExtension As String = ""
Dim docFileSize As Long
GetBytesAndExtension(docBytes, docExtension, docFileSize)
If docBytes IsNot Nothing Then
Dim ms As New MemoryStream(docBytes)
With ms
Dim dataLengthToRead As Long = ms.Length
Dim blocksize As Integer
If dataLengthToRead >= 5000 Then
blocksize = 5000
Else
blocksize = dataLengthToRead
End If
Dim buffer(dataLengthToRead) As Byte
Response.Clear()
Response.ClearContent()
Response.ClearHeaders()
Response.BufferOutput = True
If asDownload = True Then
Response.AddHeader("Content-Disposition", "attachment; filename=" & RenderDocument.Name & "." & docExtension)
Else
Response.AddHeader("Content-Disposition", "inline; filename=" & RenderDocument.Name & "." & docExtension)
End If
Response.AddHeader("Content-Length", docFileSize.ToString())
Response.ContentType = "application/octet-stream"
While dataLengthToRead > 0 And Response.IsClientConnected
Dim lengthRead As Integer = ms.Read(buffer, 0, blocksize)
Response.OutputStream.Write(buffer, 0, lengthRead)
dataLengthToRead = dataLengthToRead - lengthRead
End While
Response.Flush()
Response.Close()
End With
Response.End()
Else
ResponseWithMessage("No Data")
End If
Else
ResponseWithMessage("No Document")
End If
Catch ex As Exception
ResponseWithMessage("ERROR: " & ex.Message)
End Try
===================
原始问题:
场景是我想加载一个调用特定ASP.Net脚本的html页面,该脚本根据存储在会话中的一些数据返回一个文档。它的功能是无关紧要的,它本可以将文档作为http响应返回,但是它可能会根据发生的情况返回多个错误字符串中的一个。
html页面显示加载的gif图像,然后当返回文档或错误消息时,它需要适当地处理这些。
我可以让页面显示错误消息而没有问题,但我不知道如何最好地处理返回的文档请求,此时它只是打开一个新窗口并再次调用url,但是是笨重的,并再次调用整个文档检索过程(同步!),这违背了使用漂亮的ajax样式加载的目的。
这是我的JQuery代码:
$(document).ready(function(){
$.post("displaydocument.aspx",null,function(data){
if (data == 'No Document'){
UpdateControls('No document has been specified to load');
}
if (data == 'No Data'){
UpdateControls('No data was found for that document');
}
if (data.indexOf('ERROR',0) != -1) {
UpdateControls(data);
}
window.open("displaydocument.aspx","doc");
window.close;
}
, "html");
});
function UpdateControls(message){
$("#txtInfo").html(message);
$("#imgLoading").hide();
}
这是我的HTML:
<div style="text-align: center; font-family: 'Trebuchet MS';">
<img alt="loading" src="/images/loader64.gif" id="imgLoading" />
<br />
<span style="font-size: small" id="txtInfo">Document is loading...</span>
</div>
您的帮助始终受到高度重视。
由于
答案 0 :(得分:2)
已更新:我认为问题在于您尝试在一种方法中做太多。我将它分成两个操作:检查文档是否可用并下载文档。有你通过POST调用的方法(GET也可以工作,因为你没有传递任何数据)执行存在检查然后创建一个指向执行实际下载的文档处理程序URL的链接。将链接添加到页面并以编程方式单击它以调用下载处理程序。下载处理程序将包含您现有的代码,如果在不存在的文档上调用,则只返回错误页面。请注意,后者不会在正常操作中发生,但如果有人为下载的文档添加了书签并将其删除了。
此外,我很想使用JSON作为返回值而不是HTML来更容易处理错误。
$(function() {
$.get('checkfordocument.aspx',null,function(data) {
if (!data.Success) {
UpdateControls(data.Message);
}
else {
UpdateControls('');
$("<a href='"
+ data.Url
+ "' target='_blank' class='docLink'>"
+ "Click here if your document does not start downloading</a>")
.appendTo('#txtInfo')
.trigger('click');
}
,'json');
});
答案 1 :(得分:1)
打开窗口并使用JS设置内容,而不是向服务器发送另一个请求。
而不是
window.open("displaydocument.aspx","doc");
做类似的事情:
var win = window.open();
win.document.write(data);
这将设置新窗口的内容而不再次检索数据。
答案 2 :(得分:0)
我会创建一个web / wcf服务,如果存在某个文件,他将负责通知您。然后,您可以返回一个带有成功标志的简单json字符串,如果它失败了相关的错误消息。
这也节省了两次请求文件的需要,并且您还可以为将来的页面获得可重复使用的服务。项目。我知道应该缓存文档的响应,但是上述功能允许您向用户提供更大的错误消息通知。
$.getJson('fileExistsService.svc', { filename : someName }, function(data){
if (data.success){
//open document
window.open("displaydocument.aspx","doc");
}
else {
//display error to use
//alert(data.errorMessage)
}
})