Ошибка при попытке создать PDF с Rotativa - PullRequest
0 голосов
/ 07 мая 2019

Моя цель - разрешить пользователям печатать в формате 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] '

Я чувствую, что я рядом.,,но без сигары.

...