ASP. net Ядро 3.1 Страница Razor Управление пейджингом не работает с набором данных. - PullRequest
0 голосов
/ 01 апреля 2020

Я новичок в asp. net ядре и пытаюсь использовать управление пейджером LazZiya.TagHelpers в ASP. net ядре 3.1 Проект Razor Page для подкачки страниц для отображения новых элементов, по некоторым причинам показывает все новости (всего 20) на странице новостей, но пейджер, кажется, показывает правильные числа

Кажется, этот пейджинговый элемент управления работает только с EF, а не с Dapper, я пытался заставить его работать с dapper, который не Работа?. Ниже приведен код, связанный с Dapper, а также рабочий код с использованием EF. Я был бы признателен, если бы я мог заставить его работать также с Dapper (что, кажется, невозможно с моими ограниченными знаниями)

enter image description here

Для целей тестирования я установил размер страницы до 3, поэтому на странице должно отображаться 3 элемента, а не все 20 элементов на странице,

Кажется, что управление пейджером не является обязательным для List eNewsList= await NewsService.GetNews(1);

     public class NewsModel : PageModel
{
    public IEnumerable<News> NewsList { get; set; }

    public INewsService NewsService { get; }

    public NewsModel(INewsService newsService)
    {
        NewsService = newsService ?? throw new ArgumentNullException(nameof(newsService));
    }

    [BindProperty]
    public IEnumerable<News> eNewsList { get; set; }

    [BindProperty]
    public int TotalRecords { get; set; }

    [BindProperty]
    public int PageNo { get; set; }

    [BindProperty]
    public int PageSize { get; set; }
    // public 

    public async Task OnGet( int p=1, int s=3)
    {

        eNewsList = await NewsService.GetNews(1);     
        TotalRecords = eNewsList.Count();
        eNewsList.Skip((p - 1) * s).Take(s);
        PageNo = p;
        PageSize = s;

        //NewsList.ToList();
    }


}

Код

<div class="container">
    <div class="row">
        @foreach (var item in Model.eNewsList)
        {
            <div class="col-xl-4 col-lg-4 col-md-6">
                <div class="card">
                    <img src="images/NewsImages/@item.NewsImage" class="card-img-top" alt="...">
                    <div class="card-body">
                        <h5 class="card-title">@item.NewsHeading</h5>
                        @if (item.NewsBrief.Length > 50)
                        {
                            <p class="card-text">@item.NewsBrief.Substring(0, 50)...</p>}
                        else
                        {
                            <p class="card-text">@item.NewsBrief</p>
                        }
                        <a href="/news/@item.NewsID/@item.NewsHeading.Replace(" ", "-").ToLower()" class="btn btn-primary">Read More</a>
                    </div>
                </div>
            </div>
        }

        <div class="row">
            <div class="col-12">
                <paging  total-records="Model.TotalRecords"
                        page-no="Model.PageNo"
                        page-size="Model.PageSize">
                </paging>
            </div>
        </div>

    </div>
</div>

Код Dapper

 // Get all News
        public async Task<List<News>> GetNews(int langID)
        {
            IEnumerable<News> newslist;
            using (var conn = new SqlConnection(_configuration.Value))
            {
                string query = "select * from dbo.News Where LanguageID ="+ langID;
                        query = query +" AND NewsActive =1 AND NewsVisible=1 order by NewsDate Desc";

                conn.Open();
                try
                {
                    newslist = await conn.QueryAsync<News>(query, commandType: CommandType.Text);

                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    conn.Close();
                }

            }
            return newslist.ToList();
        }

Я не уверен, как связать eNewslist данных с пейджером

I Я использую управление пейджером от http://www.ziyad.info/en/articles/21-Paging_TagHelper_ASP_NET_Core

При использовании EF

рабочий код работает с использованием EF * 1039. *

image

Код позади

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using BookListRazor.Data;
using BookListRazor.Model;
using Microsoft.EntityFrameworkCore;

namespace BookListRazor.Pages
{
    public class NewsModel : PageModel
    {
        // for EF
        private readonly ApplicationDbContext _db;

        public IEnumerable<News> NewsList { get; set; }

        public INewsService NewsService { get; }

        //constructor
        public NewsModel(INewsService newsService, ApplicationDbContext db)
        {
            //for EF
            _db = db;

            //For Dapper
            NewsService = newsService ?? throw new ArgumentNullException(nameof(newsService));
        }


        [BindProperty]
        public IEnumerable<News> eNewsList { get; set; }

        [BindProperty]
        public int TotalRecords { get; set; }

        [BindProperty(SupportsGet = true)]
        public int P { get; set; }

        [BindProperty(SupportsGet = true)]
        public int S { get; set; }

        // public 

        public async Task OnGet()
        {

            //code block for pager to work with EF only
            //pager doesnt work with dapper
            P = 1;
            S = 3;

            //var pageQS=1;
            if (!String.IsNullOrEmpty(HttpContext.Request.Query["p"]))
            {
                P = int.Parse(HttpContext.Request.Query["p"]);
            }

            var query = await _db.News.OrderByDescending(x => x.NewsDate).Where(x => x.LanguageID == 1 && x.NewsActive==true && x.NewsVisible==true).ToListAsync();
            TotalRecords = query.Count();

            //steps for paging
            eNewsList = await _db.News.OrderByDescending(x=>x.NewsDate).Where(x =>x.LanguageID==1).Skip((P - 1) * S).Take(S).ToListAsync();


            // Dapper without pagging
           // NewsList = await NewsService.GetNews(1);
        }


    }
}

1 Ответ

1 голос
/ 01 апреля 2020

Ниже приведена упрощенная реализация бэкэнд-пейджинга.

public IEnumerable<News> eNewsList { get; set; }

public int TotalRecords { get; set; }

[BindProperty(SupportsGet = true)]
public int P { get; set; }

[BindProperty(SupportsGet = true)]
public int S { get; set; }

public async Task OnGetAsync()
{
    var query = await NewsService.GetNews(1);

    TotalRecords = query.Count();

    eNewsList = await NewsService.GetNews(1).Skip((P - 1) * S).Take(S).ToListAsync();
}

Также обратите внимание на следующие уведомления:

1 - Не извлекайте весь набор данных, получайте только сумму будет отображаться сразу

Поскольку я не знаю, что такое NewsService.GetNews(1) Я полагаю, что он возвращает полный набор записей.

Возвращать полный набор записей не рекомендуется, потому что это будет потреблять много памяти, пропускной способности и времени обработки. Я рекомендую использовать некоторые реализации EF linq, чтобы избежать проблем с обработкой. Например:

var records = dbContext.Set<News>()
                       .AsNoTracking()
                       .Where(**some search filter**);

Такая реализация будет преобразована в запрос, который не будет выполнен, пока вы не вызовете .ToList() или .ToListAsync(). Таким образом, вы убедитесь, что вы возвращаете только запрошенное количество записей.

И когда вы звоните .Count(), он будет возвращать только количество записей без извлечения всего набора данных.

2 - Делать записи порядок перед подкачкой

Если вы используете какой-либо вид подкачки, очень важно, чтобы вы упорядочили записи до разбивки на страницы, чтобы вы получили следующую страницу записей в том же порядке, например

var records = await NewsSerive.GetNews(1)
                    .OrderBy(x => x.Name)
                    .Skip((P - 1)*S).Take(S)
                    .ToListAsync();

3 - Настройки размера страницы

Еще одно примечание относительно PagingTagHelper, если вы хотите изменить значения страницы на значения, отличные от значений по умолчанию, используйте атрибут [page-size-dropdown-items] как описано в демонстрационной странице

...