ASP .NET MVC 4,数据表提交和并发表单提交

时间:2013-04-30 09:51:30

标签: asp.net-mvc forms jquery datatables

所以,我在这里尝试做的很简单,在我的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",
        };;
}

我在页面上对表单进行了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;
});

而且bam工作正常,我现在唯一的问题就是知道文件何时可以下载,iframe的加载事件,onreadystatechange出乎意料的没问题,但onload仍然拒绝我

0 个答案:

没有答案