2017-03-14 3 views
0

私は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); 
      }, 

     }); 
    } 
}); 

感謝助けてください。

+0

複雑なオブジェクトのコレクションを 'new {summary = @ Model.reportsList} 'を使ってGETメソッドに送ることはできません - 理解するために生成したURLを見てください。しかし、サーバー全体を元の状態に戻すということは、パフォーマンスを低下させているだけです。ビューを生成するために使用した4つのパラメータを送り返すだけで、pdfを作成するために必要な 'List 'を再構築することができます。 –

答えて

0

Getメソッドのほんの一部をお願いしています。モデルのバインディングで複雑なリストオブジェクトを処理できるように、代わりに投稿するフォームに切り替える必要があります。

関連する問題