0

私は非常に ajax を多用した Web サイトを持っています。基本的には SPA ですが、すべてのガイドラインに従っているわけではないため、ラベルを付けることはしません。

ページの div にあるストアがあり、jquery ajax とノックアウトを介して更新されます。最後に必要なものの 1 つは、サード パーティの 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>

そして、ノックアウトを使用して、フォームを送信する前に ProductToDownload を設定します。

$('フォーム').submit();

私ができるようにしたいのは、フォームがフェッチされている間にローダーをスローするなど、アクションが実行されて終了したことをユーザーに示すことです。

私の問題は、 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 をローカルに保存するのではなく、別のサービスからリクエストすることに注意してください。

4

1 に答える 1

0

コメントからのコーリーのリンクは素晴らしい解決策でした! 私の呼び出しはすでに複雑な型を想定しており、追加のパラメーターを渡すことができなかったため、少し調整する必要がありました。

    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));
    .....
}
于 2013-11-06T04:04:25.923 に答える