Могу ли я загрузить файл в проекте Blazor без взаимодействия с JS?C#

Место общения программистов C#
Ответить
Anonymous
 Могу ли я загрузить файл в проекте Blazor без взаимодействия с JS?

Сообщение Anonymous »

Предпосылка
Я работаю над программой Blazor, которая обрабатывает базу данных компаний и связанные с ней операции CRUD.
Я использую .NET 8.0, пишу в Visual Studio Community 2026 v. 18.3.0, с InteractiveServer в качестве режима рендеринга для всего решения по умолчанию, управляю файлами .xls/.xlsx через ClosedXML 0.102.0.
Цель
Я хочу реализовать функцию, которая позволит пользователю загружать файл .xlsx, перечисляющий все компании, соответствующие последним установленным фильтрам.
Такая функция уже предоставляется внешним API (см. ниже), который работает должным образом вместе с версией MVC той же программы.
проблема
Могу ли я достичь желаемого результата, не прибегая к взаимодействию JavaScript?
Это вопрос, возникший из чистого любопытства, поскольку я изучаю Blazor, пока пишу (и я также не являюсь экспертом в .js и C#), поэтому я хочу, чтобы он был как можно более «чистым». Я исследовал эту тему пару часов и, похоже, вынужден прибегнуть к js.
Код
Вот текущая итерация функции внутри компонента Razor, вызывающая ApiServices для загрузки файла:
public async Task DownloadExcelResults()
{
FiltersDto filters = Filters;
filters.PageNumber = 1;
filters.PageSize = int.MaxValue;

var excelFile = await _service.GetCompaniesExcelAsync(filters);

// Downloads the .xlsx file from the API response
return FileResult(excelFile, "application/vnd.ms-excel", "Companies.xlsx");
}

File и FileResult не работают как возвращаемые типы, поскольку в этом контексте они являются статическими типами, что было головной болью при первом копировании функции из версии MVC.
Вот соответствующая функция ApiServices:
public async Task GetCompaniesExcelAsync(FiltersDto filters)
{
var request = new RestRequest("company/export", Method.Post);
request.AddJsonBody(filters);

var response = await _client.ExecuteAsync(request);

if (!response.IsSuccessful)
{
throw new Exception($"API error: {response.ErrorMessage}");
}

return new MemoryStream(response.RawBytes);
}

А вот сама функция API (я пропускаю заполнение файла .xlsx, поскольку он работает так, как задумано, и я не думаю, что это связано с этой конкретной проблемой):
[HttpPost("export")]
public async Task ExportCompanies(FiltersDto filters)
{
// Populates the sheet
// ...

// Creates an .xls file via ClosedXML
var wb = new XLWorkbook();

// MemoryStream for handling the file
var ms = new MemoryStream();

// Populates the sheet
// ...

wb.SaveAs(ms);

var filename = $"{DateTime.Now:yyyyMMddHHmmss}_{"Companies"}.xlsx";

return File(ms.ToArray(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... js-interop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»