【问题标题】:.NET Core 5 MVC Pagination With Custom Filter.NET Core 5 MVC 分页与自定义过滤器
【发布时间】: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)">&laquo; Previous</a>
        </li>
        <li class="page-item @(Model.Products.HasNext?"":"disabled")">
            <a class="page-link" asp-route-pagenum="@(Model.Products.PageNumber+1)">Next &raquo;</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


【解决方案1】:

在您的项目过程中,几乎会再次出现类似的问题。 因此,我认为这里应该启发的总体思想是“如何在 asp.net MVC 中跨请求保留参数”。

而答案就是 Http Request 的基础。 您可能有 2 个明显的选择是存储参数和任何应该在服务器上的多个请求中存活的内容:

  • 通过使用缓存和会话 ID。
  • 通过将参数与每个 Http 请求一起发送。

我强烈推荐第二种方法,因为它灵活且简单。

这个想法是当服务器接收到 Http Request 时,通过 ViewData 或 ViewBag 将其传递回客户端,然后让客户端将它们附加到下一个请求,因为您可以在视图层轻松实现它们。

如果您还不熟悉这些东西,我建议您以this 为起点。

现在,无需第三方依赖,完全控制您如何分页结果并计算所有结果以更好地描述您的分页列表,如果您已经使用 EF Core,这将更加容易。

【讨论】:

  • 非常感谢,我会试试这个并告诉你结果。
猜你喜欢
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2011-07-03
  • 2018-01-14
相关资源
最近更新 更多