【发布时间】:2018-10-25 14:52:16
【问题描述】:
我在 ASP .Net Core MVC 应用程序中有一个分页表,其中表的第一个“页面”正确显示了指定的表行数。问题是当按下“下一步”按钮将异步调用发送到控制器操作以获取下一组行时,服务器无法找到控制器操作。
我一直在关注this guide,正如它所概述的,应将以下代码用于视图中的页面链接(已修改以在本例中使用):
@{
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>
【问题讨论】:
-
为什么在提交按钮上有
asp-action?它应该在表格上,不是吗?此外,仅使用您发布的代码,很难知道发生了什么。至少你也应该显示Controller? -
@DavidLiang 对,我用控制器操作中的代码以及 html 表单更新了帖子。
-
我看到您在表单上使用了
POST方法。在您提到的指南中,使用了GET。 -
@DavidLiang 我从控制器操作中删除了
[HttpPost]标签。这是解决问题的最佳方法吗? -
通常对于分页,您应该只需要一个控制器操作来拥有一个参数
page=1,就像您所拥有的一样,以指示当前的页面选择。在分页项链接上,您可以获取当前url并将page参数更改为currentPage + - 1、currentPage + - 2等。您不需要使用表单提交进行分页。
标签: c# asp.net-mvc entity-framework asp.net-core pagination