我有一个非常ajax重的网站,它基本上是一个SPA,但我不会标记它,因为它不遵循所有的指导方针。
我有一个商店,它位于页面上的div中,并通过jquery ajax和knockout更新。我需要的最后一件事是能够从第三方Web服务下载pdf。我可以使用以下
下载pdf<form action="/Dashboard/DownloadPdf" method="POST" style="display:none;" id="ProductDownload" data-bind="with: ProductToDownload">
<input type="hidden" id="Name" name="Name" data-bind="value: Name"/>
<input type="hidden" id="FileName" name="FileName" data-bind="value: FileName"/>
<input type="hidden" id="Id" name="Id" data-bind="value: Id"/>
<input type="hidden" id="Date" name="Date" data-bind="value: Date"/>
<input type="hidden" id="Number" name="Number" data-bind="value: Number"/>
</form>
我在提交表单之前使用knockout填充ProductToDownload。
$( '形式')提交();
我希望能够为用户提供一些动作正在发生并已完成的指示,例如在获取表单时抛出一个加载器。
我的问题在于能够知道form.submit()何时完成。
我如何知道表单提交何时完成,以便我可以清理加载程序等。
下面是我用来下拉pdf的代码,如果有人能够验证我是否正确执行,那将会很棒。
[HttpPost]
public void DownloadPdf(Product product)
{
var asr = Services.GetProduct(Token, product);
Response.ClearHeaders();
Response.ClearContent();
Response.AppendHeader("Content-Disposition","attachment; filename=" + product.FileName);
Response.ContentType = "application/pdf";
Response.BinaryWrite(asr.Payload.Pdf);
Response.End();
}
请注意,我们不会在本地存储PDF,我们会从其他服务请求。
答案 0 :(得分:0)
来自评论的Cory链接是一个很好的解决方案!我不得不调整它,因为我的电话已经预期复杂的类型,我无法传递任何其他参数。
function Download() {
$('.storeView').before($('#Loading').html()); //Put up loading
var attempts = 20;
var cookieId = vm.ProductToDownload().FileName; // This name is being sent in the parameters
var downloadTimer = setInterval(function() {
var token = $.cookie(cookieId); // I used the jquery.cookie.js plugin to clean things up
if (token || attempts === 0) {
$('.k-loading-mask').remove();
clearInterval(downloadTimer);
$.removeCookie(cookieId);
}
attempts--;
}, 1000);
$('form').submit();
}
然后在我的服务器上
public ActionResult Download(Product product)
{
.....
System.Web.HttpContext.Current.Response.Cookies.Add(new HttpCookie(product.FileName, product.FileName));
.....
}