Как обновить ModelStateError после загрузки файла? - PullRequest
1 голос
/ 06 июня 2019

[ Web dev noob - не знаком с терминами javascript, jquery, ajax и аналогичными терминами и не может полностью понять его концепции, и поэтому большинство «базовых» решений представлено в SO.Пришел из разработки Winforms]

Что я пытаюсь сделать :

  1. Загрузить файл Excel (несколько строк), который был закодирован на основе шаблона (есть input type="file" и кнопка загрузки)
  2. Выполнение всех видов проверки (например, не был выбран файл, выбран файл, отличный от xls / xlsx, фактический анализ и проверка загруженного файла,и т. д.) - это делается с помощью ModelState.AddModelError()
  3. Если при синтаксическом анализе файла были обнаружены ошибки в логике проверки, загруженный файл Excel был изменен, а новый столбец - новым.К нему добавлено «Ошибки», которое содержит ошибки, найденные в каждой строке, и загружается в виде некоторого файла журнала (все еще файла Excel), где я использовал EPPlus.
  4. Если ошибок нет, просто отобразитесообщение, информирующее пользователя об успешной загрузке.


Моя проблема :

Пока я уже могу загрузить файл, а затем подтвердить егоесли успех или с ошибками.Если последнее, я уже могу скачать файл журнала ошибок.Что я не могу сделать, так это попытаться объединить действия , которые вызывают ошибку проверки, а затем преднамеренно загрузить файл 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.

Требование :

  1. Определенно нужно загрузить файл журнала ошибок
  2. Также обязательно нужно сообщение об ошибке, чтобы соответствовать реальному сценарию


Как теперь я могу сделать оба?

Кроме того, мой вид выглядит примерно так:

@{
    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")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...