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 表单。然而,我想要做的是并行运行 Ajax 查询并同步 2 答案服务器端,可能是通过使用 Session 对象。

所以这是第一个问题,这是解决该问题的正确方法吗?

不知道该问题的答案,我继续尝试并行运行 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 提交?如果是的话,我该怎么做?

编辑: 所以我找到了另一种方法来解决我的问题,我将服务器函数 getPDF 分成 2 个函数,一个准备数据,另一个生成 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",
        };;
}

我对页面上的表单进行了 Ajaxified,一旦回调完成,我就从 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