停止在MVC中执行HTTPPOST操作方法

时间:2015-03-31 05:34:23

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

我在MVC Framework中有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中Count大于零然后我返回File下载..但如果我在lstDemographics中没有得到任何记录,那么我返回视图..

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

谢谢..

2 个答案:

答案 0 :(得分:2)

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

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

成功时,view会发出另一个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();
    }

答案 1 :(得分:0)

您应该使用$ .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。