Как сохранить IEnumerable вне метода get

Я пытаюсь экспортировать таблицу в Excel со страницы ASP.NET Core Razor. Я создал IEnumerable с именем Delays и использовал его для отображения таблицы и применения сортировки.

Теперь я хочу экспортировать ту же отсортированную таблицу в Excel, но эта IEnumerable становится нулевой после выхода из метода Get(). Как мне сохранить это отсортированное и отфильтрованное IEnumerable после метода Get()? Или я могу создать еще один IEnumerable и скопировать один из другого?

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using SMS_Automation.Data;
using SMS_Automation.Model;
using OfficeOpenXml;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.IO;

namespace SMS_Automation.Pages
{
 
    public class delay_viewModel : PageModel
    {
        private readonly ApplicationDbContex _db;

        public IEnumerable<Delay_Model> Delays { get; set; }

        public delay_viewModel(ApplicationDbContex db)
        {
            _db = db;
        }

        public void OnGet()
        {
            Delays = _db.Delay;
            Delays = Delays.OrderByDescending(s => s.Agency);        
        }

        public async Task<IActionResult> OnPostExportExcelAsync()
        {
            // above code loads the data using LINQ with EF (query of table), you can substitute this with any data source.
            var stream = new MemoryStream();

            using (var package = new ExcelPackage(stream))
            {
                var workSheet = package.Workbook.Worksheets.Add("Sheet1");
                workSheet.Cells.LoadFromCollection(Delays, true);
                workSheet.Column(4).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
                workSheet.Column(5).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
                workSheet.Column(10).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
                workSheet.Cells.AutoFitColumns();

                package.Save();
            }

            stream.Position = 0;

            // I define the name of the file using the current datetime
            string excelName = $"Delays-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";

            // This will be the actual export
            return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName); 
        }
    }
}

Я пытался совместить одно IEnumerable с другим, но не получилось.

Здесь строка workSheet.Cells.LoadFromCollection(Delays, true); выдает нулевую ошибку

Anvesh Jadav 14.08.2023 06:14

Вы пытались материализовать запрос: Delays = Delays.OrderByDescending(,,,).ToList()?

Flydog57 14.08.2023 07:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

HTTP не имеет состояния. Состояние, заданное в одном запросе, недоступно в другом. Это по дизайну. Если вы хотите работать с данными в обработчике запросов Post, вам нужно создать их там.

public async Task<IActionResult> OnPostExportExcelAsync()
{
    // instantiate Delays here
    Delays = _db.Delay.OrderByDescending(s => s.Agency);
    var stream = new MemoryStream();
    using (var package = new ExcelPackage(stream))
    {
        var workSheet = package.Workbook.Worksheets.Add("Sheet1");
        workSheet.Cells.LoadFromCollection(Delays, true);
        workSheet.Column(4).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
        workSheet.Column(5).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
        workSheet.Column(10).Style.Numberformat.Format = "dd-MM-YYYY hh:mm";
        workSheet.Cells.AutoFitColumns();
        package.Save();
    }

    stream.Position = 0;   
    string excelName = $"Delays-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName); 
}

Спасибо, Майк. Это работает. Но что, если я передаю строку из формы и фильтрую данные на основе этого, чтобы сначала отобразить отфильтрованные данные, а затем я хочу экспортировать тот же список в Excel?

Anvesh Jadav 14.08.2023 10:10

@AnveshJadav Используйте привязку модели: Learnrazorpages.com/razor-pages/model-binding

Mike Brind 14.08.2023 12:23

Другие вопросы по теме