【问题标题】:Stop Execution of HTTPPOST ActionMethod in MVC在 MVC 中停止执行 HTTPPOST ActionMethod
【发布时间】:2015-06-04 08:33:44
【问题描述】:

我在 MVC 框架中有 webApplication..

我有一种情况,我必须让用户将一些数据导出到 csv 文件 为此,我编写了以下代码..

   [HttpPost]
     public  ActionResult ExportReportToFile(ReportCriteriaViewModels posdata, string name)
     {
            string strQuery = GetReportQuery(posdata, name);
            IEnumerable<REP_MM_DEMOGRAPHIC_CC> lstDemographics = ReportDataAccess.GetReportData<REP_MM_DEMOGRAPHIC_CC>(strQuery);
            if (lstDemographics.Count() > 0)
                  return new CsvActionResult<REP_MM_DEMOGRAPHIC_CC>(lstDemographics.ToList(), "LISDataExport.csv");
             else
               return view(posdata);
        }

上面的代码工作正常...如果在 listResult 计数大于零然后我返回文件下载..但如果我在lstDemographics 中没有得到任何记录然后我返回视图..

我的问题是当我在lstDemographics 中没有得到任何结果时,我不想返回视图,因为它会刷新整个视图。所以有什么方法可以停止执行 Action Method 并且浏览器不会刷新查看并保持原样..

谢谢..

【问题讨论】:

  • 所以你需要一个客户端(使用 AJAX)验证来检查用户是否可以提交表单
  • 尝试返回 ContentResult 说“未找到记录”
  • 它也重定向到空白页...我试过返回内容(“未找到记录”)..语法正确吗?

标签: c# asp.net-mvc model-view-controller asp.net-mvc-5 action-filter


【解决方案1】:

您应该使用 $.getJSON 方法创建 javascript 函数。 在控制器端,您只需要检查,如果您从数据库中获取数据,则返回文件路径,否则返回消息。

你的 JS 代码应该是这样的:

                $.getJSON(url)
                    .done(function (data) {
                        if (data.filePath) // If get data, fill filePath
                            window.location = data.filePath;
                        else
                            alert(data.msg);
                    });

您可以从控制器创建一个返回 JSON 数据的 HTTPGET Action 方法,例如:

return Json(new { msg = "No data found" }, JsonRequestBehavior.AllowGet);

根据条件,您可以使用 filePath 简单地更改 msg。

【讨论】:

    【解决方案2】:

    您必须进行 AJAX 调用才能停止页面刷新。

    为了实现文件导出,我们实际上打破了两个 AJAX 调用的过程。第一次调用向服务器发送请求,服务器准备一个文件并将其存储在临时表中。如果有数据,服务器将文件名返回给 AJAX 调用。如果没有数据或错误,则返回 JSON 结果以指示失败。

    成功后,查看发出另一个 AJAX 请求以下载传递文件名的文件。

    类似这样的:

        [Audit(ActionName = "ExportDriverFile")]
        public ActionResult ExportDriverFile(int searchId, string exportType, string exportFormat)
        {
            var user = GetUser();
            var driverSearchCriteria = driverSearchCriteriaService.GetDriverSearchCriteria(searchId);
    
            var fileName = exportType + "_" + driverSearchCriteria.SearchType + "_" + User.Identity.Name.Split('@')[0] + "." + exportFormat;
            //TempData["ExportBytes_" + fileName] = null;
            _searchService.DeleteTempStore(searchId);
    
            var exportBytes = exportService.ExportDriverFileStream(driverSearchCriteria, searchId, exportType, exportFormat, user.DownloadCode, user.OrganizationId);
            if (exportBytes != null)
            {
                var tempStore = new TempStore
                {
                    SearchId = searchId,
                    FileName = fileName,
                    ExportFormat = exportFormat,
                    ExportType = exportType,
                    DataAsBlob = exportBytes
                };
    
                var obj = _searchService.AddTempStore(tempStore);
                return Json(fileName);
            }
            else
            {
                return Json("failed");
            }
        }
    
        [HttpGet]
        public ActionResult DownloadStream(string fileName, int searchId)
        {
            var tempStore = _searchService.GetTempStore(searchId);
            var bytes = tempStore.DataAsBlob;
            if (bytes != null)
            {
                var stream = new MemoryStream(bytes);
               // TempData["ExportBytes_" + fileName] = null;
                _searchService.DeleteTempStore(searchId);
                return File(stream, "application/vnd.ms-excel", fileName);
            }
    
            _logger.Log("Export/DownloadStream request failed", LogCategory.Error);
            return Json("Failed");
        }
    

    在客户端,我们执行以下操作:

        function ExportData(exportType, exportFormat) {
    
            var searchId = document.getElementById('hfSelectedDriverId').value;
            var model = { searchId: searchId, exportType: exportType, exportFormat: exportFormat };
            //$('div[class=ajax_overlay]').remove();
            //alert("The file will be downloaded in few minutes..");
    
            $.ajax({
                url: '@Url.Action("ExportDriverFile", "Export")',
                contentType: 'application/json; charset=utf-8',
                type: 'POST',
                dataType: 'html',
                data: JSON.stringify(model)
            })
                .success(function (result) {
                    result = result.toString().replace(/"/gi, "");
                    if (result == "" || result == "failed")
                    {
                        alert("File download failed. Please try again!");
                    }
                    else
                    {
                        window.location = '/Export/DownloadStream?fileName=' + result+"&searchId="+searchId;
                    }
                })
            .error(function (xhr, status) {
                //
                //alert(status);
            });
    
            //$('div[class=ajax_overlay]').remove();
        }
    

    【讨论】:

    • 但我认为当使用 AJAX 调用 DownloadStream 时不会返回文件并且浏览器不会打开下载/保存文件对话框。要下载文件,您必须在按钮单击时使用 HTTPPOST
    • @ghanshyam.mirani:在 ajax 中,获取数据并将其与使用传递的模型和名称值创建的 unqiue 键一起放入缓存中,如果 lstDemographics.count 大于 0,则返回 true/false。在 jquery ajax 成功事件中,如果返回 true 则提交表单 -$("#formid").submit()
    • @ghanshyam.mirani - 添加了对我们有用的内容。试试这个示例代码,我相信你会明白的。
    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 2021-09-14
    • 2022-01-09
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多