Добавьте подкачку к существующему контроллеру ActionResult, который передает ViewModel.

Я использую веб-приложение MVC 5, EF 6, Code First в Visual Studio 2013 Pro отсюда: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

Я хотел бы объединить представление, которое имеет функцию подкачки, а также имеет возможность отображать связанные данные из ViewModel.

В указанном выше веб-приложении представление Student Index (ViewResult в контроллере) имеет функции разбиения на страницы и сортировки и не использует ViewModel.

В том же приложении представление Instructor Index (ActionResult в контроллере) не имеет функций разбиения по страницам и сортировки, но отображает связанные данные (курсы) с помощью «Select» Html.ActionLink на той же странице, что и Instructor. Индексные данные.

Мне нравится представление «Студент», которое предоставляет функции разбиения по страницам и сортировки, а также мне нравится представление «Инструктор», которое позволяет отображать связанные данные на существующей странице индекса, но я не знаю, как их объединить.

Кто-нибудь знает, как я могу добавить функцию пейджинга в представление Instructor Index, сохраняя при этом возможность отображать связанные данные на той же странице просмотра Index?

Другой способ задать тот же вопрос: как добавить разбиение по страницам и сортировку в представление Instructor Index, сохраняя при этом возможность отображения связанных данных?

Любая помощь будет принята с благодарностью.

Спасибо, Тони

Вот метод Index из InstructorController.cs:

        public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
    {
        ViewBag.CurrentSort = sortOrder;
        ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
        ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

        if (searchString != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }

        ViewBag.CurrentFilter = searchString;

        var instructors = from i in db.Instructors
                       select i;
        if (!String.IsNullOrEmpty(searchString))
        {
            instructors = instructors.Where(i => i.LastName.ToUpper().Contains(searchString.ToUpper())
                                   || i.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
        }
        switch (sortOrder)
        {
            case "name_desc":
                instructors = instructors.OrderByDescending(i => i.LastName);
                break;
            case "Date":
                instructors = instructors.OrderBy(i => i.HireDate);
                break;
            case "date_desc":
                instructors = instructors.OrderByDescending(i => i.HireDate);
                break;
            default:  // Name ascending 
                instructors = instructors.OrderBy(i => i.LastName);
                break;
        }

        int pageSize = 3;
        int pageNumber = (page ?? 1);
        return View(instructors.ToPagedList(pageNumber, pageSize));
    }

Вот начало кода представления для Instructor/Index.cshtml:

@model PagedList.IPagedList<LakesidePurchasing.ViewModels.InstructorIndexData>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />

    @{
        ViewBag.Title = "Instructors";
    }

    <h2>Instructors</h2>

    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table class="table">
        <tr>
            <th>Last Name</th>
            <th>First Name</th>
            <th>Hire Date</th>
            <th>Office</th>
            <th>Courses</th>
            <th></th>
        </tr>

        @foreach (var item in Model)
        {
            string selectedRow = "";
            if (item.ID == ViewBag.InstructorID)
            {
                selectedRow = "success";
            }
            <tr class="@selectedRow">
                <td>
            @Html.DisplayFor(model => Model.LastName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FirstMidName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.HireDate)
        </td>
        <td>
            @if (item.OfficeAssignment != null)
            {
                @item.OfficeAssignment.Location
            }
        </td>

person Tony    schedule 25.11.2014    source источник
comment
Подводя итог: вы хотите, чтобы представление отображало информацию об инструкторе вместе со списком дочерних записей на страницах?   -  person markpsmith    schedule 26.11.2014
comment
Я просто хочу добавить возможность разбиения по страницам и сортировки в представление Instructor Index и оставить все остальное без изменений. Мне не нужен постраничный список для дочерних записей.   -  person Tony    schedule 27.11.2014
comment
Я не понимаю - какие данные должны быть выгружены? Курсы?   -  person markpsmith    schedule 27.11.2014
comment
Я хотел бы показать вам его изображение, но если вы запустите приложение из этого учебника и щелкнете пункт меню «Инструктор», он покажет список инструкторов (представление «Индекс»). Это то, что я хочу пейджинг. Спасибо.   -  person Tony    schedule 27.11.2014
comment
Кажется, я видел это в pdf. Это список преподавателей со списком курсов и списком студентов?   -  person markpsmith    schedule 27.11.2014
comment
Да это верно.   -  person Tony    schedule 27.11.2014
comment
поэтому было бы легко развернуть результаты инструктора с помощью библиотеки PagedList, но я не уверен, как вы будете иметь дело с данными «Курсы» и «Студенты»   -  person markpsmith    schedule 27.11.2014
comment
Да, я добавил пейджинг в представление инструктора, и он отлично работает. Мне просто нужно знать, как сохранить возможность отображать связанные данные (курсы и студенты). Я считаю, что это в возврате от контроллера. У меня есть возврат View(instructors.ToPagedList(pageNumber, pageSize));, но мне нужно знать, как включить соответствующие данные в этот возврат.   -  person Tony    schedule 27.11.2014
comment
Вам нужно вернуть модель, которая содержит данные списка страниц И студентов И курсы. У вас уже должно быть что-то похожее, так как в демо-версии эти 3 набора данных отображаются на странице.   -  person markpsmith    schedule 27.11.2014
comment
Я согласен с первым предложением в вашем комментарии. Я немного озадачен вашим следующим утверждением. Я теряю возможность отображать связанные наборы данных (курсы и студенты), потому что переданная модель не включает их. Вы так говорите, будто я создал эту обучающую программу.   -  person Tony    schedule 27.11.2014
comment
Извините - я просто имел в виду, что если вы следовали руководству, наверняка вы прошли модель, содержащую 3 набора данных? Я только просмотрел pdf, так что извиняюсь, если сделал вопиющую ошибку. В любом случае, это сводится к тому, что вам нужно включить «курсы» и «студенты» в модель, которую вы передаете в представление. Я понимаю, что выгружаемые данные содержат только данные инструктора, поэтому вам нужно каким-то образом получить другие данные, реально во втором запросе.   -  person markpsmith    schedule 27.11.2014
comment
Да, я вижу в приложении, что Instructor ViewModel имеет InstructorIndexData.cs, ​​который содержит IEnumerable для Instructor, Course и Enrollment. После изменения представления Instructor Index для использования библиотеки PagedList он не использует ViewModel, что приводит к потере связанных данных.   -  person Tony    schedule 27.11.2014
comment
Вы по-прежнему должны использовать модель InstructorIndexData, но вместо свойства IEnumerable<Instructor> Instructors вы используете PagedList.IPagedList<Instructor> Instructors и назначаете свой instructors.ToPagedList(pageNumber, pageSize) to it   -  person markpsmith    schedule 27.11.2014
comment
Читать код в комментариях ужасно, извините за это - я пытался переместить его в чат, но только с 1 очком репутации это было запрещено!   -  person markpsmith    schedule 27.11.2014
comment
Спасибо, Марк. Я попробую это и дам вам знать. Счастливого Дня Благодарения. Тони   -  person Tony    schedule 27.11.2014
comment
Это не сработало. Представление Index может найти поля для отображения (@Html.DisplayFor(modelItem =› item.LastName)). Спасибо.   -  person Tony    schedule 28.11.2014
comment
можно или нельзя не?   -  person markpsmith    schedule 28.11.2014
comment
Прости, Марк. Не мог. Спасибо.   -  person Tony    schedule 28.11.2014
comment
Предполагая, что теперь вы используете модель InstructorIndexData, вам нужно будет изменить элементы управления представлением, чтобы они получали доступ к свойствам Instructor. Что-то вроде: @Html.DisplayFor(model => model.Instructors.LastName)   -  person markpsmith    schedule 28.11.2014
comment
Я не могу заставить это работать. Intellisense не отображает имена полей или инструктора по имени модели. Спасибо.   -  person Tony    schedule 29.11.2014
comment
Можете ли вы отредактировать свой исходный вопрос и добавить код, который заполняет модель (из контроллера)?   -  person markpsmith    schedule 01.12.2014
comment
Вы не используете модель InstructorIndexData.   -  person markpsmith    schedule 01.12.2014
comment
Исходный метод Index для InstructorController использовал модель InstructorIndexData. Вот почему я здесь, потому что я хотел бы, чтобы кто-то помог объединить исходный метод Instructor Index, который использует модель InstructorIndexData, с новым методом Instructor Index, который использует разбиение по страницам. Спасибо.   -  person Tony    schedule 01.12.2014


Ответы (1)


Это была ваша исходная модель:

public class InstructorIndexData
{
  public IEnumerable<Instructor> Instructors { get; set; }
  public IEnumerable<Course> Courses { get; set; }
  public IEnumerable<Enrollment> Enrollments { get; set; }
}

Вы хотите отобразить данные инструктора с разбивкой по страницам, поэтому вам нужно изменить их на это:

public class InstructorIndexData
   {
      public PagedList.IPagedList<Instructor> Instructors { get; set; }
      public IEnumerable<Course> Courses { get; set; }
      public IEnumerable<Enrollment> Enrollments { get; set; }
   }

Заселено так:

var model = new InstructorIndexData
{
    Instructors = instructors.ToPagedList(pageNumber, pageSize),
    Courses = ?,
    Enrollments = ?
}
return View(model);

Модель, которую вы передаете в представление, не изменилась, но изменился способ доступа к записям инструкторов, хотя я полагаю, что вы можете успешно отображать выгруженные данные.
То, как заполняются свойства курсов и зачислений, зависит от того, какие данные должны быть показаны, вы должны иметь возможность изначально установить для них значение null, чтобы заставить его работать (вам, вероятно, придется иметь проверки на значение null в представлении, чтобы избежать ошибки, если он попытается отобразить значение из нулевого свойства)

ОБНОВЛЕНИЕ:

измените объявление View @model:

@model InstructorIndexData

и в foreach...

@foreach (var item in Model.Instructors)
        {
           <td>@item.LastName</td>
           ... etc
person markpsmith    schedule 01.12.2014
comment
Я получаю неверный термин выражения '?' на вопросительные знаки (?). Спасибо. - person Tony; 01.12.2014
comment
Это должно означать: «Я не знаю, что вам здесь нужно». - person markpsmith; 01.12.2014
comment
В ПОРЯДКЕ. Я использовал null для курсов и регистраций. Представление уже содержало проверки того, что курсы и зачисления являются нулевыми. Я все еще не могу заставить представление найти поля для DisplayFor. Спасибо. - person Tony; 01.12.2014
comment
Пожалуйста, добавьте пример кода просмотра, где это так. - person markpsmith; 01.12.2014
comment
Попробуйте использовать StaticPagedList, как показано здесь - person markpsmith; 02.12.2014