Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 下载文件后如何更新ModelStateError?_Asp.net Mvc_Export To Excel_Modelstate - Fatal编程技术网

Asp.net mvc 下载文件后如何更新ModelStateError?

Asp.net mvc 下载文件后如何更新ModelStateError?,asp.net-mvc,export-to-excel,modelstate,Asp.net Mvc,Export To Excel,Modelstate,[Web dev noob-不熟悉javascript、jquery、ajax和类似术语,不能完全理解其概念,因此SO.中介绍的大多数“基本”解决方案来自Winforms开发] 我想做的事: 上载基于模板编码的excel文件(多行)(有一个input type=“file”和一个上载按钮) 执行所有类型的验证(例如,未选择任何文件、选择了xls/xlsx以外的文件、上载文件的实际解析和验证等)-使用ModelState.AddModelError() 如果在解析文件时,验证逻辑发现了错误,则会修

[Web dev noob-不熟悉javascript、jquery、ajax和类似术语,不能完全理解其概念,因此SO.中介绍的大多数“基本”解决方案来自Winforms开发]

我想做的事

  • 上载基于模板编码的excel文件(多行)(有一个
    input type=“file”
    和一个上载按钮)
  • 执行所有类型的验证(例如,未选择任何文件、选择了xls/xlsx以外的文件、上载文件的实际解析和验证等)-使用
    ModelState.AddModelError()
  • 如果在解析文件时,验证逻辑发现了错误,则会修改上载的excel文件,并向其中添加一个新列“errors”,其中包含每行发现的错误,并作为某个日志文件(仍然是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();
    }
    
    正如我所料,这段代码应该替换步骤1中显示的ModelState错误:“错误:未选择任何文件”→ “有关错误,请参阅下载的文件。”

    实际情况

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

    我试图做的事(考虑到我对web开发一无所知):

    尝试了一些随机调试-我注释掉了调用
    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")
    }
    
    @{
    ViewBag.Title=“批量上传”;
    }
    批量上传
    @使用(Html.BeginForm(“Bulk”、“MyModel”、FormMethod.Post、new{enctype=“multipart/formdata”}))
    {
    @Html.AntiForgeryToken()
    
    @Html.ValidationSummary(true,“,new{@class=“text danger”}) @ValidationMessage(“BulkUploadError”,new{@class=“text danger”})
    文件路径:

    } @ActionLink(“返回列表”、“索引”) @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) }