私はWebアプリケーションで部分的な表示にAjaxを使用しています。この部分図には、現在モデルのテーブル/リスト<>にあるデータに基づいてPDFファイルをダウンロードするリンクが含まれています。ASP.NET MVC - 空のリストを送信するHtml.Action
次のように部分的な図である。
@model Inspection_Reports.ViewModel.SummaryReportViewModel
<table id="summaryReportTable" class="table-condensed table-striped">
<thead><tr><td>Inspector</td><td>Attendant</td><td>Property</td><td>Room Number</td><td>Date</td><td>HK Score</td><td>Maint. Score</td></tr></thead>
<tbody id="resultsContainer">
@foreach (var report in @Model.reportsList)
{
<tr><td>@report.inspect.empName</td><td>@report.attendant.empName</td><td>@report.location.locName</td><td>@report.room</td><td>@report.endTime</td><td>@report.hkDisplay</td><td>@report.mainDisplay <input type='hidden' name='reportId[i]' /></td></tr>
}
</tbody>
</table>
@Html.ActionLink("Export as PDF", "GenerateSummaryPDF", new { summary = @Model.reportsList })
GenerateSummaryPDF方法:
public FileResult GenerateSummaryPDF(List<report_summary> summary) {
Document doc = pdfWorker.readyDocument("Inspection Report, Generated " + DateTime.Now.ToString("MM-dd-yyyy"));
pdfWorker.createSummaryReport(doc, summary);
pdfWorker.savePDF(doc, String.Format("{0}/Inspection_Summary_{1}.pdf", @"C:\Users\Khandokar\Desktop", DateTime.Now.ToString("MM-dd-yyyy")));
return File(String.Format("{0}/Inspection_Summary_{1}.pdf", @"PATH", DateTime.Now.ToString("MM-dd-yyyy")), "application/pdf", "Inspection.pdf");
問題がGenerateSummaryPDFが呼び出されたときに、要約リストが空である、ということです。リストはnullではありませんが、項目はありません。
しかし、なぜこれが当てはまるのかわかりません。エクスポートリンクをクリックすると、Model.reportsListにデータがあります。テーブルに表示され、さらにブレークポイントを設定することによって検証されます。
親ビュー:
@model Inspection_Reports.ViewModel.SummaryReportViewModel
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Report Summaries</title>
</head>
<body>
<h2>Summary Reports</h2>
<form class="form-horizontal">
<div class="form-group"><label class="control-label col-md-2">Start Date: </label><div class="col-md-4"><input class="form-control summaryFilter" type='text' value="@Model.fromDate" name='startDate' id='startDate' /></div><label class="control-label col-md-2">End Date: </label><div class="col-md-4"><input type='text' value="@Model.toDate" class='form-control summaryFilter' name='endDate' id='endDate' /></div></div>
<div class="form-group">
<label class="control-label col-md-2">Filter By: </label>
<div class="col-md-4">
<select class="form-control summaryFilter" name="filterTypeList" id="filterTypeList">
<option value="">Select...</option>
<option value="Property">Property</option>
<option value="Attendant">Attendant</option>
<option value="Inspector">Inspector</option>
</select>
</div>
<label class="control-label col-md-2">Filter Selection: </label><div class="col-md-4">
<select class="form-control summaryFilter" name="filterSelectionList" id="filterSelectionList"></select>
</div>
</div>
</form>
<div id="reportResults">
@{Html.RenderPartial("SummaryPartialView", Model);}
</div>
@section scripts {
<script src="~/Scripts/ajaxReports.js"></script>
}
</body>
</html>
(この記事に大きく基づいた:https://cmatskas.com/update-an-mvc-partial-view-with-ajax/)部分ビューを移入するために使用される方法に
[HttpGet]
public async Task<ActionResult> GetSummaryReports(string fromDate, string toDate, string filterType, string filterValue)
{
DateTime from = Convert.ToDateTime(fromDate);
DateTime to = Convert.ToDateTime(toDate);
Int32 filterValID = Int32.Parse(filterValue);
SummaryReportViewModel vm = await GetSummaryVM(from, to, filterType, filterValID);
return PartialView("SummaryPartialView", vm);
}
private async Task<SummaryReportViewModel> GetSummaryVM(DateTime from, DateTime to, string filterType, int filterValID)
{
SummaryReportViewModel vm = new SummaryReportViewModel();
to = to.AddDays(1);
var reports = dbContext.report_summary.Where(r => r.endTime <= to && r.endTime >= from);
if (filterType.Equals("Property"))
{
reports = reports.Where(r => r.locationID == filterValID);
}
else if (filterType.Equals("Attendant"))
{
reports = reports.Where(r => r.employee == filterValID);
}
else
{
reports = reports.Where(r => r.inspector == filterValID);
}
vm.reportsList = reports.ToList<report_summary>();
return vm;
}
のためのAjax
$(".summaryFilter").change(function() {
var fromDate = $("#startDate").val();
var toDate = $("#endDate").val();
var filterType = $("#filterTypeList").val();
var filterValue = $("#filterSelectionList").val();
if (filterValue != null || typeof (filterValue) != typeof (undefined)) {
$.ajax({
url: "GetSummaryReports?fromDate=" + fromDate + "&toDate=" + toDate + "&filterType=" + filterType + "&filterValue=" + filterValue,
type: 'get',
success: function (data) {
$("#reportResults").html(data);
},
});
}
});
感謝助けてください。
複雑なオブジェクトのコレクションを 'new {summary = @ Model.reportsList} 'を使ってGETメソッドに送ることはできません - 理解するために生成したURLを見てください。しかし、サーバー全体を元の状態に戻すということは、パフォーマンスを低下させているだけです。ビューを生成するために使用した4つのパラメータを送り返すだけで、pdfを作成するために必要な 'List'を再構築することができます。 –