【发布时间】:2021-08-03 15:16:18
【问题描述】:
我正在为我的大学三年级项目进行开发,对于这个项目,我决定使用我不太熟悉的 .NET Core 5 MVC。 我通常使用剃须刀页面,但对于像这样的重要项目,我想使用行业标准。 无论如何,我为该项目创建了大部分内容,但是当涉及到分页时,我发现了一个问题。
这是控制器动作的代码,我使用类从查询链接中获取参数(添加了很多过滤器,这就是我使用类的原因)。
[Route("/Catalogue")]
public async Task<IActionResult> AllProducts([FromQuery] ProductParameters parameters,int pagenum=1)
{
parameters.PageNumber = pagenum;
ViewData["BrandId"] = new SelectList(await brandsrepo.GetBrandsList(), "Id", "Name");
ViewData["CategoryId"] = new SelectList(await categoryrepo.GetCategoryList(), "Id", "Name");
var viewmodel = new AllProductsViewModel { Products = await productrepo.GetProductsList(parameters), Parameters = new() };
return View(viewmodel);
}
我尝试使用我从使用asp-route-{param_name}="{value}" 的剃须刀页面中知道的内容。
但是当我搜索并尝试转到下一页时,所有查询参数(过滤器和搜索词等)都消失了,它只转到第二页。
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
<li class="page-item @(Model.Products.HasPrevious?"":"disabled")">
<a class="page-link" asp-route-pagenum="@(Model.Products.PageNumber-1)">« Previous</a>
</li>
<li class="page-item @(Model.Products.HasNext?"":"disabled")">
<a class="page-link" asp-route-pagenum="@(Model.Products.PageNumber+1)">Next »</a>
</li>
</ul>
</nav>
我希望我能找到一种方法来进行分页以及保留已经存在的参数。 我有一个最后的手段是使用剃须刀组件,我在这个项目中使用了很多可重用组件。
【问题讨论】:
-
在控制器中创建您需要的视图属性...在获取时绑定它们。然后您可以在 cshtml 文件中使用这些路由 (asp-route-propertyName)。对于剃刀页面,您不需要返回视图。只需绑定您的模型(视图)。或者返回“Page()”
-
因此为 GET 声明 [BindProperty(SupportsGet = true)] ... 对于搜索字符串,请务必检查空值: if (string.IsNullOrEmpty(SearchString)) { SearchString = "";在 POST 上: if (!string.IsNullOrEmpty(SearchString)) { SearchString.Trim(); ... }
-
您可能还会发现“pagedlist.mvc”很有用。它在 Visual Studio 的包管理器中。它提供了一个实用功能,使事情变得更容易一些。 (它会为您的模型添加实用功能。)
-
@mason 抱歉,我没有注意到我的资本化太多,我猜是因为 c# 编程太多。
-
@pcalkins 谢谢我在文档中看到了 pagedlist,我会试一试,我没有尝试过,因为我已经创建了一个名为 paged list 的自定义类,它可以做类似的事情
标签: c# asp.net .net asp.net-mvc asp.net-core