Использование пейджинга в частичном представлении, asp.net mvc

Буду признателен, если кто-нибудь сможет посоветовать следующее: На мой взгляд, я показываю список элементов:

@model PagedList.IPagedList<Items>
@using PagedList.Mvc; 
 @foreach (var item in Model)
          {//displaying data}

мой пейджер выглядит следующим образом:

@Html.PagedListPager(Model, page => Url.Action("Index", new { humanID = ViewBag.HumanID, page = page }),
                                                             new PagedListRenderOptions
                                                             {
                                                                        LinkToFirstPageFormat = "<<",
                                                                        LinkToPreviousPageFormat = "prev",
                                                                        LinkToNextPageFormat = "next",
                                                                        LinkToLastPageFormat = ">>",

                                                              })

Проблема в том, что когда я нажимаю на следующую страницу, она возвращается пустым, без моего _Layout. Я бы не хотел перезагружать _Layout все время. Есть ли способ использовать Ajax.ActionLink для пейджера? Чтобы я мог UpdateTargedId внутри моего частичного просмотра?

Ответ 1

Вы не можете использовать Ajax.ActionLink, но вы можете AJAXify ссылки. Поместите пейджер в <div>:

<div id="myPager">
    @Html.PagedListPager(
        Model, 
        page => Url.Action(
            "Index", 
            new { 
                humanID = ViewBag.HumanID, 
                page = page 
            }
        ),
        new PagedListRenderOptions
        {
            LinkToFirstPageFormat = "<<",
            LinkToPreviousPageFormat = "prev",
            LinkToNextPageFormat = "next",
            LinkToLastPageFormat = ">>",
        }
    )
</div>

а затем AJAXify ссылки:

$(function() {
    $('#myPager').on('click', 'a', function() {
        $.ajax({
            url: this.href,
            type: 'GET',
            cache: false,
            success: function(result) {
                $('#some_grid_container').html(result);
            }
        });
        return false;
    });
});

Обратите внимание, что в обратном вызове success я использовал $('#some_grid_container'), который должен быть оберткой div вокруг всей вашей таблицы.

Ответ 2

Есть еще способ реализовать Ajax с PagedList.

@Html.PagedListPager((IPagedList)Model,
 page => Url.Action("Index", new { humanID= ViewBag.HumanID, page }), PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(PagedListRenderOptions.PageNumbersOnly,
        new AjaxOptions
        {
            InsertionMode = InsertionMode.Replace,
            HttpMethod = "Get",
            UpdateTargetId = "targetContainer"
        }))

Эта часть сделает запрос ajax и заменит содержимое в "targetContainer". Это дает вам больше возможностей в отношении вызова Ajax и способа, которым вы хотите, чтобы это отображалось.

Ответ 3

Моя настройка проекта: MVC4, MvcPaging (PagedList) с областями. Этот ответ ориентирован на эту настройку.

Короткий ответ:
При настройке вашего AjaxOptions для пейджера убедитесь, что вы установили область (правильно)

new AjaxOptions { UpdateTargetId = "grid-list" , OnBegin = "beginPaging", 
                  OnSuccess = "successPaging", OnFailure = "failurePaging"}
        , new { area = "Admin", controller = "MyController", action = "Index"}

Длинный ответ:
В примере PagedList показано, как перейти в область и выполнить подкачку в пределах области, но они не показывают пример использования пейджинга с частичным представлением.

Пример проекта имеет следующий код (взятый из _AjaxEmployeeList.cshtml):

}, new AjaxOptions
            {
                UpdateTargetId = "grid-list",
                OnBegin = "beginPaging",
                OnSuccess = "successPaging",
                OnFailure = "failurePaging"
            }, 
    new { controller = "Home", action = "Index", 
        employee_name = ViewData["employee_name"] }))

В примере PagedList используется встроенная таблица внутри foreach, поэтому у вас нет проблем/конфликтов с этой настройкой.

@using MvcPaging
@model IPagedList<MvcPagingDemo.Models.Employee>
<table class="table table-bordered table-hover">
        @foreach (var item in Model)
        { 
            <tr>
               <td>@item.ID</td>
            </tr>
        }    
</table>

Во время рефакторинга этой таблицы в частичное представление (для инкапсуляции логики (и для обработки пейджинга) я начал получать "Частичный вид '_MyPartialView' не был найден или механизм просмотра не поддерживает найденные местоположения"

@using MvcPaging
@using MyProject.Models
@model IPagedList<MyProject.Models.MyModel>
  foreach (var item in Model)
        {
        <div data-task-id="@item.MyModel_ID.ToString()">
            @Html.Partial("_Detail", item)
        </div>
        }

Я просмотрел рацион изменений, пытающихся заставить область вызвать вызов Html.Partial(), в том числе:
Изменение способа обработки маршрутизации, которое не работает.
Как установить маршрут по умолчанию (в зону) в MVC
Полностью определил путь к частичному представлению, который работал, но был уродлив.
mvc3 - использование частичных представлений в другой области
Исследование, связанное с получением частичных представлений, показало мне, как обрабатывает запросы MVC. Это отправило меня назад, чтобы изменить Ajax Pager, чтобы отправить область с каждым запросом. Я попытался использовать аналогичный синтаксис, как Html.ActionLink. (Это не работает/не работает)

@Html.ActionLink("Admin", "Index", "Admin", new { area = "Admin" }, null)

Это не сработало, так что все провалилось, я отразил шаблон для установки контроллера, который приводит нас к:

new AjaxOptions { UpdateTargetId = "grid-list" ,  OnBegin = "beginPaging", 
                  OnSuccess = "successPaging", OnFailure = "failurePaging"}
           , new { area = "Admin", controller = "MyController", action = "Index"}

Мой личный урок из этого: С#!= Razor!= Javascript. Каждый делает все по-другому, и вы должны быть уверены, что знаете, на каком языке находится ваша запись.