Использование пейджинга в частичном представлении, 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. Каждый делает все по-другому, и вы должны быть уверены, что знаете, на каком языке находится ваша запись.