繁体   English   中英

在MVC中停止执行HTTPPOST ActionMethod

Stop Execution of HTTPPOST ActionMethod in MVC

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在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中的计数大于零,则我返回文件进行下载..但是,如果我在lstDemographicslstDemographics获取任何记录,则返回视图。

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

谢谢..

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

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

您的JS代码应如下所示:

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

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

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

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

5 MVC中的httppost动作

我正在一个MVC项目上,我从下面的代码中使用Controller来注册消息,但是我对此有疑问。 当我执行代码时,它找不到联系人页面,但是当我注释[httppost]时,它可以加载联系人页面,我在哪一步做错了? 谢谢 ...

6 MVC 1中的HttpPost

我必须维护一个使用MVC 1的项目。似乎它对[HttpPost]一无所知,并且对get和post调用相同的操作方法。 区分创建视图和提交表单数据的正确方法是什么? 谢谢。 ...

7 HTTP POST,在MVC中获取?

在MVC3中,我创建了一个注册表。 我创建了一个模型,控制器和视图。 这是我的代码: } 但objs在对象public actionresult Insert(models.Empoyees objs)动作方法参数表示空值。 Imean Ename Ename=Null , ...

9 在Selenium IDE中执行HTTP POST

我想使用带有XML有效负载的Selenium IDE对服务器执行单个HTTPS POST。 我正在与之交互的服务不支持HTTPS GET,或者我会这样做。 (执行HTTPS GET非常简单,因为整个URL都会进入Selenium open命令。)我知道还有其他方法可以进行HTTP POST, ...

10 HttpPost不在MVC中触发

我在页面上有两个按钮,我希望用户单击一个按钮,然后它们都转到不同的页面,问题是我的httpPost属性没有触发。 这是我的控制器: 这是我的看法: 谁能看到我做错了什么? 我的第二个索引方法中是否需要参数? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM