所以,我在这里尝试做的很简单,在我的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仍然拒绝我