У меня есть страница, которая отображает различные сетки пользователей моего приложения. Администратор может просматривать всех пользователей каждой роли и их статус в сетках. Я настроил его так, чтобы они могли переключаться между ролями с помощью списка ссылок на роли в верхней части страницы. Когда они нажимают на любую из этих ссылок, он загружает частичное представление, которое показывает сетку. Частичное представление также имеет фильтры, позволяющие фильтровать данные, а сетка имеет сортировку и разбиение на страницы.
Кажется, что все работает нормально, за исключением случаев, когда я go перехожу на новую страницу, сетка обновляется, но ссылки на страницы в нижней части сетки не обновляются. Так что, если я go на странице 2, новые данные отображаются в сетке, НО он по-прежнему говорит, что я страница 1, поэтому я не могу перейти обратно на страницу 1. Я могу принудительно перезагрузить всю страницу, и пейджинг работает , но я не хочу перезагружать всю страницу, я хочу использовать javascript для обновления только сетки.
Вот мой код контроллера:
public ActionResult Index()
{
var model = new PupilViewModel();
// get data
return View("PupilIndex", model);
}
public ActionResult FilterPupils(PupilGridViewModel viewModel, long personTypeId = 3, int page = 1, string sort = null, string sortDir = null)
{
//get data, filter and sort
return PartialView("_PupilGrid", model);
}
Мой взгляд:
@model ProjectName.Models.ViewModels.PupilViewModel
@{
Layout = "~/Views/Shared/_LayoutMinimal.cshtml";
ViewBag.Title = "MyGrids";
}
<div class="container" style="width: 100%; height: 600px;">
<div class="w3-bar w3-blue">
<ul>
@foreach (var item in Model.PupilTypes)
{
<li style="float: left; list-style-type:none;" class="w3-bar-item w3-button tablink tab">
<a onclick="LoadGrid(this)" data-id="@item.Id" id="@item.Id" style="padding: 10px;">@item.Name</a>
</li>
}
</ul>
</div>
<br />
<div id="gridPupilResults" style="margin-left: 5px; margin-right: 5px;">
@{ Html.RenderAction("FilterPupils", "Pupil", new { personTypeId = @personTypeId });}
</div>
</div>
<script type="text/javascript">
function LoadGrid(e) {
var id = e.id;
var url = '@Url.Action("FilterPupils", "Pupil")';
$.get(url, {
type: "GET",
personTypeId: id,
dataType: 'json',
contentType: false,
processData: false
})
.done(function (result) {
$('#gridPupilResults').html(result);
});
}
</script>
И мое частичное представление, которое на самом деле имеет сетку:
@model ProjectName.Models.ViewModels.PupilGridViewModel
@{
var grid = new WebGrid(null, ajaxUpdateContainerId: "grid-content", rowsPerPage: Model.RowsPerPage, pageFieldName: "CurrentPage");
grid.Bind(Model.Items, rowCount: Model.RecordCount, autoSortAndPage: false);
}
@functions
{
List<WebGridColumn> RenderGridColumns(WebGrid grid)
{
//code to generate columns
}
}
<div id="fullGrid">
<div class="col-md-3 grid-filters">
//stuff for filters here
</div>
<div id="gridData" class="col-md-9 grid-content">
<br\>
@if (Model == null || !Model.Items.Any())
{
<span>No records were found.</span>
}
else
{
@grid.GetHtml(tableStyle: "gridtable"
, columns: RenderGridColumns(grid)
)
}
</div>
</div>
Тогда вот javascript в частичном представлении ... Заметьте, я перехватываю ссылки на пейджинговые ссылки, которые веб-сетка автоматически внедряется в страницу, поэтому она выполняет мой ajax вызов.
<script type="text/javascript">
$("#gridData").click(function (event) {
event.preventDefault();
var page = event.target.innerText;
RefreshData(page);
});
function RefreshData(page) {
var _filterSelectors = $('.filter-container').find('.filter-headings input, .filter-Value input');
var id =@personTypeId;
var queryString;
if (page != null) {
queryString = _filterSelectors.serialize() + "&personTypeId=" + id + "&page=" + page;
}
else {
queryString = _filterSelectors.serialize() + "&personTypeId=" + id;
}
return $.ajax({
type: "POST",
url: '@Url.Action("FilterPupils", "Pupil")',
data: queryString,
success: function (result) {
var initialText = $('#gridPupilResults').find('.grid-content');
var replaceText = $(result).find('.grid-content').html();
initialText.html(replaceText);
},
complete: function (e) {
console.log(e.error);
},
error: function (e) {
console.log(e.error);
console.log(e.src);
console.log(e.st);
console.log(e.Inner);
}
});
}
$('.filters-submit').click(function () {
RefreshData();
});
</script>
Это хорошо работает, но мне нужно что-то добавить в свое возвращение, чтобы обновить ссылки на страницы? Это как если бы мне нужно было задать индекс страницы webgrids, но я не уверен, как или возможно ли это в функции javascript.
По сути, я не могу использовать GET в своем вызове ajax, потому что тогда я не могу пройти все мои критерии фильтра. Если я просто разрешу запускать пейджинговую ссылку, то вся страница обновляется, что позволяет установить правильную страницу в веб-сетке, но затем я теряю фильтры, которые выбрал пользователь, а также замедляет пейджинг из-за сброса всей страницы.