Моя цель - разрешить пользователям печатать в формате PDF, просмотр.Я нашел Nuget по имени Rotativa и следовал некоторым базовым учебникам.В тесте он работал отлично и выглядел как отличный ответ для удовлетворения моих потребностей.
Однако я обнаружил, что внедрение его в действующий рабочий проект дает мне ошибки, которых не было в простом тесте.
У меня есть индексное представление, которое представляет собой список.Я хочу, чтобы пользователи распечатывали этот список в формате PDF.Я пробовал много разных классов Rotativa (ViewAsPDF, ActionAsPDF, GeneratePDF ...).Я исследовал и прочитал множество учебных пособий.Но я думаю, что проблема больше связана с моей моделью.,
Вот что у меня есть до сих пор
Индексный вид
@model IEnumerable<ICS20web.Models.IndexViewModel>
@{
ViewBag.Title = "Index";
}
<style>
#content {
}
.even {
background-color: #dcf1b8;
}
.odd {
background-color: #f4ffe1;
}
</style>
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<p>
<p>
@Html.ActionLink("Print", "PrintAllReport")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.ItemDescription)
</th>
<th>
@Html.DisplayNameFor(model => model.OriginalDate)
</th>
<th>
@Html.DisplayNameFor(model => model.TransType)
</th>
<th>
@Html.DisplayNameFor(model => model.LastUpdatedBy)
</th>
<th>
@Html.DisplayNameFor(model => model.ContactName)
</th>
<th>
@Html.DisplayNameFor(model => model.OpenClosed)
</th>
<th>
@Html.DisplayNameFor(model => model.CurrentStatus)
</th>
<th>
@Html.DisplayNameFor(model => model.CurrentStatusDate)
</th>
<th>
@Html.DisplayNameFor(model => model.RequsitionNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.PONumber)
</th>
<th>
@Html.DisplayNameFor(model => model.DeliveryMonth)
</th>
<th>
@Html.DisplayNameFor(model => model.DeliveryYear)
</th>
<th>
@Html.DisplayNameFor(model => model.UnitsOrdered)
</th>
<th>
@Html.DisplayNameFor(model => model.Emergency)
</th>
<th>
@Html.DisplayNameFor(model => model.Comments)
</th>
<th>
@Html.DisplayNameFor(model => model.DeliveryUnit)
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ItemDescription)
</td>
<td>
@Html.DisplayFor(modelItem => item.OriginalDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.TransType)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastUpdatedBy)
</td>
<td>
@Html.DisplayFor(modelItem => item.ContactName)
</td>
<td>
@Html.DisplayFor(modelItem => item.OpenClosed)
</td>
<td>
@Html.DisplayFor(modelItem => item.CurrentStatus)
</td>
<td>
@Html.DisplayFor(modelItem => item.CurrentStatusDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.RequsitionNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.PONumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.DeliveryMonth)
</td>
<td>
@Html.DisplayFor(modelItem => item.DeliveryYear)
</td>
<td>
@Html.DisplayFor(modelItem => item.UnitsOrdered)
</td>
<td>
@Html.DisplayFor(modelItem => item.Emergency)
</td>
<td>
@Html.DisplayFor(modelItem => item.Comments)
</td>
<td>
@Html.DisplayFor(modelItem => item.DeliveryUnit)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.TransID })
</td>
</tr>
}
</table>
Вид загружается в браузер с правильными данными из модели, правильно.Но когда пользователь нажимает на ActionLink PrintAllReport.,,Я вижу следующую ошибку: System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.
Ссылочная строка @foreach (элемент var в Model)
Я считаю, что это говорит мне о том, чтоМодель пуста?Но как это может быть, когда он просто заполняется в браузере.
Вот мое действие контроллера индекса
public ActionResult Index()
{
var q = from tr in db.ICS_Transactions
join un in db.ICS_Units
on tr.DeliveryUnitID equals un.DeliveryUnitID
join kt in db.ICS_Contacts
on tr.Contact equals kt.LoginID
join sp in db.ICS_Supplies on tr.SuppliesID equals sp.Supplies_ID
orderby tr.Emergency descending, tr.TransID ascending
select new IndexViewModel
{
TransID = tr.TransID,
ItemDescription = sp.ItemDescription,
OriginalDate = tr.OriginalDate,
TransType = tr.TransType,
LastUpdatedBy = tr.LastUpdatedBy,
ContactName = kt.ContactName,
OpenClosed = tr.OpenClosed,
CurrentStatus = tr.CurrentStatus,
CurrentStatusDate = tr.CurrentStatusDate,
RequsitionNumber = tr.RequsitionNumber,
PONumber = tr.PONumber,
DeliveryMonth = tr.DeliveryMonth,
DeliveryYear = tr.DeliveryYear,
UnitsOrdered = tr.UnitsOrdered,
Emergency = tr.Emergency,
Comments = tr.Comments,
DeliveryUnit = un.DeliveryUnit,
PhoneNumber = un.PhoneNumber,
Street = un.Street,
City = un.City,
State = un.State,
ZipCode = un.ZipCode,
Building = un.Building,
Room = un.Room
}
;
return View(q.Where(d => d.OpenClosed == "Open").ToList());
}
А вот мое действие PrintAllReport
public ActionResult PrintAllReport()
{
var model = new IndexViewModel();
//Code to get content
return new Rotativa.ViewAsPdf("Index") { FileName = "TestViewAsPdf.pdf" };
}
Создает ошибку ссылки на объект.Я сбит с толку.Разве это не должно работать точно так же, как индекс, загруженный в браузер?Чего мне не хватает?
Я также пробовал это так:
public ActionResult PrintAllReport()
{
var report = new ActionAsPdf("Index");
return report;
}
Последнее выдает мне ошибку аутентификации: Вы не авторизованы для просмотра этой страницы из-за неверных заголовков аутентификации.
Я новичок в MVC5, и меня смущает, почему страница индекса загружается правильно, но действие PrintAllReport не открывается в pdf.И что мне нужно изменить, чтобы заставить его работать должным образом.
Обновление:
После того, как Стюард дал мне хорошую информацию, я сделал некоторые изменения, как указано ниже
{
var viewModel = new IndexViewModel();
var report = new ViewAsPdf("Index", viewModel);
return report;
}
Теперь я получаю другую ошибку
Элемент модели, переданный в словарь, имеет тип 'ICS20web.Models.IndexViewModel', но для этого словаря требуется элемент модели типа 'System.Collections.Generic.IEnumerable`1 [ICS20web.Models.IndexViewModel] '
Я чувствую, что я рядом.,,но без сигары.