下载文件后如何更新ModelStateError?

时间:2019-06-06 09:46:53

标签: asp.net-mvc export-to-excel modelstate

[ Web开发新手-不熟悉javascript,jquery,ajax和类似术语,并且不能完全理解其概念,因此大多数SOA中都提供了“基本”解决方案。来自Winforms开发]

我要做什么

  1. 上传基于模板(有一个input type="file"和一个Upload按钮)编码的excel文件(多行)
  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")
}

0 个答案:

没有答案