首页 > 解决方案 > 文件下载后如何更新 ModelStateError?

问题描述

[ 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();
}

现在正如我所料,此代码应替换步骤 1 中显示的 ModelState 错误:“错误:未选择文件”→“请参阅下载的文件以了解错误。”

实际情况

日志文件下载,但错误消息更新。

我试图做的(考虑到我在网络开发方面的零知识):

尝试了一些随机调试 - 我注释掉了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")
}

标签: asp.net-mvcexport-to-excelmodelstate

解决方案


推荐阅读