1

したがって、ここでやろうとしていることはかなり単純です。ASP .NET MVC4 アプリケーションでは、ユーザーがさまざまな請求書を選択して生成された PDF を取得できるテーブルがあります (すべての請求書の pdf を明確にしてください)。テーブルを装飾するためにデータテーブルを使用しています。

ただし、ページネーションがDOMオブジェクトを破壊することに気付いたので、フォームを送信する前に、テーブルからすべての行をおとりにロードする必要があります:

@using (Html.BeginForm("getPDF", "Invoice", FormMethod.Post, new { id="PostForm" }))
{
    <table style="display:none;">        
    </table>
}

<table id="invoiceTable">
    <thead>
        --Snip of headers--
    </thead>
    <tbody>
        @Html.DisplayForModel()
    </tbody>
</table>

フォームが送信されたら、この小さな js/jquery を使用するだけです

$('#PostForm').submit(function () {
    $('table', this).append(oTable.fnGetNodes());
    return true;
});

コントローラーで完全なテーブルを受け取り、小さなPDFを生成します。

ただし、これは問題を引き起こします。送信後、クリーンアップする必要がある役に立たないデータでいっぱいの目に見えないテーブルがあるためです。ファイルをダウンロードしようとしているため、フォームを Ajax フォームに変換できません。しかし、私がやりたかったことは、おそらく Session オブジェクトを使用して、Ajax クエリを並行して実行し、サーバー側で 2 つの回答を同期させることです。

ここで最初の質問に進みます。これはその問題に対する適切なアプローチですか?

その質問に対する答えがわからないまま、先に進んで Ajax クエリを並行して実行しようとしました。

$('#PostForm').submit(function () {
    $('table', this).append(oTable.fnGetNodes());

    $.ajax({
        url: "/Invoice/getPDFAjaxSync",
        type: "POST",
        success: function (result) {
            alert('hello');
        },
        error: function (result) {
            alert('error');
        }
    });

    return true;
});

これは機能しません。ajax クエリ自体は機能しますが、PostForm フォームの送信内で実行しようとすると、常にエラー メッセージが表示されずに失敗し、サーバー メソッドに到達し、ブレークポイントがそれを確認しますが、サーバーがまだブレークポイントによって一時停止されている場合でも、クライアント側で失敗します。2 番目の質問は次のとおりです。

通常の送信と Ajax の 2 つの送信を同時に実行することは可能ですか? はいの場合、どうすればいいですか?

編集: 私は自分の問題に対する別のアプローチを見つけたので、サーバー関数 getPDF を2つの関数に分けました.1つはデータを準備し、もう1つはPDFを生成します:

[HttpPost]
public ActionResult readyPDF(IEnumerable<InvoiceListableViewModel> invoiceViewModels)
{
    SysParam l_sp = db.SysParams.Single(sp => sp.paramId == 1);

    int[] l_invoiceId = invoiceViewModels
                        .Where(ivm => ivm.Pick)
                        .Select(ivm => ivm.InvoiceId)
                        .ToArray();

    List<PDFTemplateViewModel> l_inv = /*load data*/
                                 .ToList();
    Session.Add("InvoicesToPrint", l_inv);
    return new JsonResult();
}

[HttpGet]
public ActionResult getPDF()
{
    List<PDFTemplateViewModel> l_inv = new List<PDFTemplateViewModel>();

    if (Session["InvoicesToPrint"] != null && Session["InvoicesToPrint"] is List<PDFTemplateViewModel>)
        l_inv = (List<PDFTemplateViewModel>)Session["InvoicesToPrint"];

    return new ViewAsPdf("DisplayTemplates/PDFTemplates/PDFReportMain", l_inv)
        {
            FileName = "Invoices.pdf",
        };;
}

ページのフォームを Ajax 化し、コールバックが完了したら、iframe からデータをダウンロードします

$('#PostForm').submit(function () {
    $('#hiddenTable', this).append(oTable.fnGetNodes());

    $.ajax({
        url: this.action,
        type: this.method,
        data: $(this).serialize(),
        success: function (result) {
            oTable.fnDraw();
            $('#PdfLoader').attr('src', '@Url.Action("getPDF")');
        },
    });

    return false;
});

そして、それは機能します。私の唯一の問題は、iframeのロードイベントで、ファイルをダウンロードする準備ができていることを知ることです。驚くべきことに、onreadystatechangeには問題はありませんが、onloadはまだ私に抵抗します

4

0 に答える 0