我在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 to download..但是如果我在lstDemographics中没有得到任何记录,那么我会返回视图..
我的问题是当我在lstDemographics中没有得到任何结果时,我不想返回视图,因为它刷新了整个视图。因此,有没有什么方法可以让我们停止执行Action方法,并且浏览器不会刷新视图并保持原样。
谢谢..
发布于 2015-03-31 13:47:54
您必须执行一个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();
}发布于 2015-03-31 15:16:41
你应该用$.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。
https://stackoverflow.com/questions/29361258
复制相似问题