所以,我在这里尝试做的事情相当简单,在我的 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 仍然抵制我