我正在尝试做一些看起来应该很容易的事情,但我是 MVC 和基于约定的编程的新手。
我有一个 jQuery 数据表,它通过 AJAX 获取 PDF 文档的行。在 中fnRowCallback
,我添加了复选框,以便用户可以选择多个文档进行组合以进行单个下载。当复选框被选中时,文档 ID 被添加到一个 JavaScript 数字数组中,文件名被添加到另一个数组中,以便在组合时,它们可以用于生成的 PDF 中的书签。有没有办法将这两个变量发送到控制器动作?到目前为止,我所能做的就是JSON.stringify()
其中一个变量并使用我放在视图中的表单中的隐藏字段将其发送到控制器,然后在控制器中对其进行反序列化,但是当我尝试添加第二个变量时,我把它搞砸了。必须有一种更简单的方法,但我什至无法弄清楚复杂的方法,我读过的所有文章都使用 AJAX。不过,我不能使用 AJAX,因为您不能在响应中发回二进制文件。
JavaScript:
var aiSelectedPDFs = new Array();
var aiSelectedDocumentIDs = new Array();
$('#imgDownload').click(function () {
$('#selectedPDFs').val(JSON.stringify(aiSelectedPDFs));
$('#selectedDocumentIDs').val(JSON.stringify(aiSelectedDocumentIDs));
$('#DownloadSelectedPdfs').submit();
});
看法:
<img id="imgDownload" src="@(Url.RootUrl())Content/images/icons/pdf.gif"
alt="Download selected documents" title="Download selected documents" />
@using (Html.BeginForm("DownloadSelectedPdfs", "Controller", FormMethod.Post,
new { id = "DownloadSelectedPdfs" }))
{
<input type="hidden" id="selectedPdfs" name="jsonSelectedPdfs"/>
<input type="hidden" id="selectedDocumentIDs" name="jsonSelectedDocumentIDs"/>
}
控制器:
[HttpPost]
public ActionResult DownloadSelectedPdfs(string jsonSelectedDocumentIDs)
{
var selectedDocumentIDs = new JavaScriptSerializer().Deserialize<int[]>(
jsonSelectedDocumentIDs);
var invoices = new Dictionary<string, byte[]>();
foreach (int documentID in selectedDocumentIDs)
{
invoices.Add(documentID.ToString(),
_documentService.GetDocument(documentID));
}
return new FileContentResult(PdfMerger.MergeFiles(invoices),
"application/pdf");
}