Blazor httpcontext в helperclass является нулевым - PullRequest
0 голосов
/ 06 февраля 2020

Здравствуйте. Я следую очень полезному руководству по добавлению нумерации страниц в блазор по этой ссылке: https://www.youtube.com/watch?v=kGvmAeSObsA. Моя проблема в том, что я пошел вперед и создал вспомогательный класс и задачу, передающую httpcontext. Это код для моего помощника:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;


namespace TranactionJournalV4.Helpers
{
    public static class HttpContextExtensions
    {
        public static async Task InsertPaginationParameterInResponse<T>(this HttpContext httpContext,
            IQueryable<T> queryable, int recordsPerPage)
        {
            double count = await queryable.CountAsync();
            double pagesQuantity = Math.Ceiling(count / recordsPerPage);
            httpContext.Response.Headers.Add("pagesQuantity", pagesQuantity.ToString());
        }
    }
}

, и это мой контроллер, который использует этот помощник

using TranactionJournalV4.Helpers;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using TranactionJournalV4.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authentication.JwtBearer;

namespace TranactionJournalV4.Data
{
    [ApiController]
    [Route("api/[controller]")]
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public class SearchService : ControllerBase
    {
        private readonly SqlDbContext context;

        public int Page { get; set; } = 1;

        public SearchService(SqlDbContext context)
        {
            this.context = context;
        }
        [HttpGet]
        [AllowAnonymous]
        public async Task<List<TransactionModel>> SearchTransactionsAsync(DateTime transactionDate, [FromQuery] PaginationDTO pagination)
        {

            var queryable = context.TransactionJournal.Where(s => s.TransactionDateTime <= transactionDate).AsQueryable();
            await HttpContext.InsertPaginationParameterInResponse(queryable, pagination.QuantityPerPage);
            return await queryable.Paginate(pagination).ToListAsync();
        }
    }
}

Теперь, когда я go через код, кажется, что все идет отлично, пока не дойдет до вспомогательного класса, мой httpcontext, кажется, продолжает показываться как нулевой. Кажется, я не могу понять, почему. Любая помощь будет оценена. Спасибо!

1 Ответ

1 голос
/ 06 февраля 2020

HttpContext существует только в контексте http. Это означает, что если вы не используете http-запрос для вызова своего кода, вы не можете получить HttpContext.

Метод Blazor не выполняется в контексте http, поэтому HttpContext имеет значение null.

Перепишите ваше расширение как расширение IQueryable, возвращающее объект ответа страницы, такой как:

class PageResponse<T>
{
    public int Count { get; set; }
    public IEnumerable<T> Items { get; set; }
}

public static class QueryableExtensions
{
   public static async Task<PageResponse<T>> GetPage<T>(this IQueryable<T> queryable, int skip, int take)
   {
        var count = await queryable.CountAsync().ConfigureAwait(false);
        return new PageResponse<T>
        {
             Count = count,
             Items = await query.Skip(skip).Take(take).ToListAsync().ConfigureAwait(false)
        }
    }
}
...