我在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而浏览器不会刷新视图并保持原样..
谢谢..
答案 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。