[ Web dev noob - не знаком с терминами javascript, jquery, ajax и аналогичными терминами и не может полностью понять его концепции, и поэтому большинство «базовых» решений представлено в SO.Пришел из разработки Winforms]
Что я пытаюсь сделать :
- Загрузить файл Excel (несколько строк), который был закодирован на основе шаблона (есть
input type="file"
и кнопка загрузки) - Выполнение всех видов проверки (например, не был выбран файл, выбран файл, отличный от xls / xlsx, фактический анализ и проверка загруженного файла,и т. д.) - это делается с помощью
ModelState.AddModelError()
- Если при синтаксическом анализе файла были обнаружены ошибки в логике проверки, загруженный файл Excel был изменен, а новый столбец - новым.К нему добавлено «Ошибки», которое содержит ошибки, найденные в каждой строке, и загружается в виде некоторого файла журнала (все еще файла Excel), где я использовал
EPPlus
. - Если ошибок нет, просто отобразитесообщение, информирующее пользователя об успешной загрузке.
Моя проблема :
Пока я уже могу загрузить файл, а затем подтвердить егоесли успех или с ошибками.Если последнее, я уже могу скачать файл журнала ошибок.Что я не могу сделать, так это попытаться объединить действия , которые вызывают ошибку проверки, а затем преднамеренно загрузить файл Excel , в котором есть ошибки.Ниже приведены фактические шаги, которые необходимо предпринять.
Шаг 1. Например, пользователь нажал кнопку «Загрузить» без предварительного просмотра соответствующего файла, например, сообщение «Ошибка: файл не выбран»".
Шаг 2. Теперь пользователь выбирает файл после выполнения шага 1, но в этом файле есть ошибки, которые не проходят логику проверки.
private void CreateErrorLog(Stream stream, string fileName)
{
this.ModelState.AddModelError("BulkUploadError", "Please refer to the downloaded file for errors.");
// generation of the excel log file
...
this.DownloadExcel(excelPackage, Path.GetFileName(newFileName));
}
public void DownloadExcel(ExcelPackage package, string fileName)
{
this.Response.Clear();
this.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
this.Response.AddHeader("content-disposition", $"attachment;filename={fileName}");
this.Response.BinaryWrite(package.GetAsByteArray());
this.Response.End();
}
Теперь, как яожидайте, этот код должен заменить ошибку ModelState, показанную на шаге 1: «Ошибка: файл не был выбран» → «Пожалуйста, обратитесь к загруженному файлу за ошибками».
Фактический сценарий :
Файл журнала загружен , но сообщение об ошибке не обновлено.
Что я пытался сделать (учитывая мои нулевые знания в web dev):
Попробовал некоторую случайную отладку - я закомментировал строку, в которой вызывается метод DownloadExcel
, и с этим сообщение об ошибке успешно обновляет .
Что я могу дляВоспроизведите из этого :
Это загрузка определенно блокирует обновление отображаемого сообщения об ошибке ModelState.
Требование :
- Определенно нужно загрузить файл журнала ошибок
- Также обязательно нужно сообщение об ошибке, чтобы соответствовать реальному сценарию
Как теперь я могу сделать оба?
Кроме того, мой вид выглядит примерно так:
@{
ViewBag.Title = "Bulk Upload";
}
<h2>Bulk Upload</h2>
@using (Html.BeginForm("Bulk", "MyModel", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.ValidationMessage("BulkUploadError", new { @class = "text-danger" })<br>
<label for="file">File path:</label>
<input type="file" name="file" id="file" accept=".xls, .xlsx" /><br><br>
<input type="submit" value="Upload" class="btn main-button" />
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}