【问题标题】:paginated next button not working in asp.net core分页的下一个按钮在 asp.net 核心中不起作用
【发布时间】:2019-11-21 09:34:46
【问题描述】:

我是 asp.net MVC 核心的新手 尝试构建一个页面,您可以在其中选择多个搜索选项

我需要一个获取和发布操作,结果应该在分页的部分视图中,代码可以正常工作,直到我单击下一个或上一个,我丢失了整个搜索结果对象,因为模型没有绑定他们回来了

[HttpGet]
        public ViewResult SearchOutbox(DocumentSearchViewModel doc)
        {
            var documentSearchViewModel = PopulateDocumentSearchViewModel(doc);//this method fills the dropdowns 
            return View(documentSearchViewModel);
        }

      [HttpPost]
        public async Task<IActionResult> SearchOutbox(DocumentSearchViewModel doc, int? page)
        {
            var documentSearchViewModel = PopulateDocumentSearchViewModel(doc);
            if (ModelState.IsValid)
            {
                IQueryable<Document> documents = _documentRepository.SearchDocument(documentSearchViewModel);
                documentSearchViewModel.Documents = await PaginatedList<Document>.CreateAsync(documents.AsNoTracking(), page ?? 1, 1);

                return View("SearchOutbox",documentSearchViewModel);

            }

            return View();
        }

局部视图

....
 <a asp-action="SearchOutbox"
           asp-route-page="@(Model.PageIndex - 1)"
           class="btn btn-default @prevDisabled">
            Previous
        </a>
        <a asp-action="SearchOutbox"
           asp-route-page="@(Model.PageIndex + 1)"
           class="btn btn-default @nextDisabled">
            Next
        </a>

主视图调用局部

 <partial name="_ListDocument" model="@Model.Documents">

【问题讨论】:

    标签: asp.net-core model-view-controller


    【解决方案1】:

    在深入细节之前,值得一提的是,分页只能使用GET,无需使用POST

    回答你的问题;如果结果集基于某些过滤器,则必须将所有这些过滤器参数与分页链接一起传递。

    例如如果你有一个像下面这样的 URL,你可以通过只向相关操作发送 page 参数来生存:

    http://example.com/products/?page=1

    但是,每当您向 URL 添加一些过滤器时,您都必须在分页按钮中包含所有过滤器,例如在下面的 URL 中,您必须将 ? 之后的所有参数发送到分页操作,以便它可以使用相同的过滤选项从过滤结果中选择下一页:

    http://example.com/products/?page=1&category=mobile&brand=xyz

    您可以手动添加所有参数,也可以使用读取查询字符串值然后仅增加页码并生成新 URL 的函数。下面是一个增加页码并通过正则表达式替换它的函数:

    <a href="@CreateUrl(-1)">Previous</a>
    <a href="@CreateUrl(1)">Next</a>
    
    @{
        string CreateUrl(int newPage)
        {
            var index = int.Parse(Request.QueryString["page"].ToString());
            var input = Request.QueryString.Value;
            var replacement = $"page={index + newPage}";
            var pattern = @"page=\d+";
            return System.Text.RegularExpressions.Regex.Replace(input, pattern, replacement);
        }
    }
    

    有一些 nuget 包可以处理高级分页功能,例如 LazZiya.TagHelpers,从 nuget 安装:

    安装包 LazZiya.TagHelpers -Version 3.0.2

    为 _ViewImports 添加分页标签助手:

    @addTagHelper *, LazZiya.TagHelpers
    

    然后在需要分页控件的地方使用它:

    <paging 
        total-records="Model.TotalRecords" 
        page-no="Model.PageNo"
        query-string-key-page-no="page"
        query-string-value="@(Request.QueryString.Value)">
    </paging>
    

    注意:在最新的预览版 (v3.1.0-preview1) 中无需添加 query-string-value,因此标签助手的工作方式如下:

    <paging 
        total-records="Model.TotalRecords" 
        page-no="Model.PageNo"
        query-string-key-page-no="page"
    </paging>
    

    tutoriallive demodocs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      相关资源
      最近更新 更多