簡単だと思われることをしようとしていますが、MVC と規約ベースのプログラミングは初めてです。
AJAX を介して PDF ドキュメントの行を取得する jQuery データテーブルがあります。にfnRowCallback
チェックボックスを追加して、ユーザーが複数のドキュメントを選択して 1 回のダウンロードに結合できるようにしました。チェックボックスをオンにすると、ドキュメント ID が数値の JavaScript 配列に追加され、ファイル名が別の配列に追加されるため、結合すると、結果の PDF のブックマークに使用できます。これら 2 つの変数をコントローラー アクションに送信する方法はありますか? これまでのところ、私ができることはJSON.stringify()
変数の1つをビューに配置し、コントローラーで逆シリアル化するフォームの隠しフィールドを使用してコントローラーに送信しますが、2番目の変数を追加しようとすると、それがうまくいきません。もっと簡単な方法があるはずですが、複雑な方法を理解することさえできず、私が読んだすべての記事は 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");
}