У меня есть разбитая на страницы таблица в приложении ASP .Net Core MVC, где первая «страница» таблицы правильно отображает количество строк таблицы, как указано.Проблема заключается в том, что при нажатии кнопки «Далее» для отправки асинхронного вызова к действию контроллера для получения следующего набора строк сервер не может найти действие контроллера.
У меня естьследовал этому руководству и, как указано, для ссылок на страницы в представлении должен использоваться следующий код (измененный для использования в этом случае):
@{
var prevDisabled = !Model.PageList.HasPreviousPage ? "disabled" : "";
var nextDisabled = !Model.PageList.HasNextPage ? "disabled" : "";
}
<a asp-action="GetResultList"
asp-route-sortOrder="@ViewData["CurrentSort"]"
asp-route-page="@(Model.PageList.PageIndex - 1)"
asp-route-currentFilter="@ViewData["CurrentFilter"]"
class="btn btn-default @prevDisabled">
Previous
</a>
<a asp-action="GetResultList"
asp-route-sortOrder="@ViewData["CurrentSort"]"
asp-route-page="@(Model.PageList.PageIndex + 1)"
asp-route-currentFilter="@ViewData["CurrentFilter"]"
class="btn btn-default @nextDisabled">
Next
</a>
Ссылка вURL при первоначальной загрузке формы - http://localhost:62501/Home/..%2FresortDeals%2FGetResultList
, но при нажатии кнопки «следующий» URL-адрес: http://localhost:62501/resortDeals/GetResultList?page=2
Это странно, поскольку действие asp для кнопки отправки формы имеетто же значение:
<div>
<input type="submit" value="View Results" asp-action="GetResultList" class="btn btn-sm" />
</div>
Я предполагаю, что проблема может быть связана со значением параметра страницы, указанным в asp-route-page
, но я точно не знаю, почему это может привести к тому, чтобудет использоваться совершенно другой URL, так как я все еще очень плохо знаком с тегами-помощниками. Что может быть причиной того, что кнопка «следующий» генерирует неверный URL?
Редактировать
действие контроллера:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> GetResultList(ResortDataJoinObj resDeals, int page =1)
{
if (ModelState.IsValid)
{
var resultsObj = (from rd in _db.ResortData
join ra in _db.ResortAvailability on rd.RecNo equals ra.RecNoDate
where ra.TotalPrice < Int32.Parse(resDeals.priceHighEnd) && ra.TotalPrice > Int32.Parse(resDeals.priceLowEnd)
select new ResortDealResultsObject
{
Name = rd.Name,
ImageUrl = rd.ImageUrl,
ResortDetails = rd.ResortDetails,
CheckIn = ra.CheckIn,
Address = rd.Address,
TotalPrice = ra.TotalPrice
});
int i = 0;
List<ResortDealResultsObject> resultList = new List<ResortDealResultsObject>();
foreach (var row in resultsObj)
{
var tempVm = new ResortDealResultsObject
{
Name = row.Name,
ImageUrl = row.ImageUrl,
ResortDetails = row.ResortDetails,
CheckIn = row.CheckIn,
Address = row.Address,
TotalPrice = row.TotalPrice
};
resultList.Add(tempVm);
}
int pageSize = 3;
var model = await PaginatedList<ResortDealResultsObject>.CreateAsync(resultsObj, page, pageSize);
ResortDataJoinObj joinObj = new ResortDataJoinObj();
joinObj.PageList = model;
ViewBag.rowsReturned = true;
return View(joinObj);
}
return View(resDeals);
}
HTML-форма:
<form asp-action="GetResultList" method="post">
<div>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<div class="row">
<div class="col-sm-1">
<label asp-for="ResData.Name"></label>
<input asp-for="ResData.Name" />
<span asp-validation-for="ResData.Name"></span>
</div>
@*<div class="col-sm-2">
<label asp-for="ResAvail.CheckIn"></label>
<input asp-for="ResAvail.CheckIn" />
<span asp-validation-for="ResAvail.CheckIn"></span>
</div>
<div class="col-sm-3">
<label asp-for="ResAvail.CheckOut"></label>
<input asp-for="ResAvail.CheckOut" />
<span asp-validation-for="ResAvail.CheckOut"></span>
</div>*@
<div class="col-sm-4">
<label asp-for="priceLowEnd"></label>
<input asp-for="priceLowEnd" />
<span asp-validation-for="priceLowEnd"></span>
</div>
<div class="col-sm-5">
<label asp-for="priceHighEnd"></label>
<input asp-for="priceHighEnd" />
<span asp-validation-for="priceHighEnd"></span>
</div>
</div>
</div>
<span asp-validation-for="ResData.Name" class="text-danger"></span>
</div>
<div>
<input type="submit" value="View Results" asp-action="GetResultList" class="btn btn-sm" />
</div>
</form>