Asp.net mvc 5 使用Ajax MVC下载excel文件
如何在MVC中使用Ajax下载文件。如果没有数据生成文件,则显示错误标签。 我正在尝试使用返回文件的操作结果方法。我可以下载文件。但如果没有可下载的文件,则不希望刷新页面。 我的代码是Asp.net mvc 5 使用Ajax MVC下载excel文件,asp.net-mvc-5,Asp.net Mvc 5,如何在MVC中使用Ajax下载文件。如果没有数据生成文件,则显示错误标签。 我正在尝试使用返回文件的操作结果方法。我可以下载文件。但如果没有可下载的文件,则不希望刷新页面。 我的代码是 public ActionResult Excel(MyViewModel model) { var result = // DB call to get data if (no data) { return **something** } else
public ActionResult Excel(MyViewModel model)
{
var result = // DB call to get data
if (no data)
{
return **something**
}
else
{
byte[] excelContent =//passing result to my method( returns xls file in byte)
return File(
excelContent, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
reportName + " Report " + startDate + " - " + endDate + ".xlsx");
}
}
什么东西我应该退货
现在我返回的是某物的emptyResult,因此如果没有数据,我会得到空白页。
Ajax不支持文件下载。
如果我提交表单并且有数据,则此代码有效。
建议一些页面无法刷新且两个任务都已完成的内容。
1.文件下载如果数据
2.如果没有数据,则显示错误标签
FileResult
var exportToExcel = function (inputData, fileName) {
var path = "url";
var form = $("<form></form>");
form.attr("enctype", "application/x-www-form-urlencoded");
form.attr("method", "post");
form.attr("action", path);
form.attr("accept-charset", "UTF-8");
var field = $("<input></input>");
field.attr("type", "hidden");
field.attr("name", "data");
field.attr("value", escape(JSON.stringify(inputData)));
form.append(field);
var field2 = $("<input></input>");
field2.attr("name", "fileName");
field2.attr("value", fileName);
form.append(field2);
$(document.body).append(form);
form.submit().remove();
var exportToExcel=函数(输入数据,文件名){
var path=“url”;
变量形式=$(“”);
form.attr(“enctype”,“application/x-www-form-urlencoded”);
表格attr(“方法”、“职位”);
form.attr(“动作”,路径);
表格attr(“接受字符集”、“UTF-8”);
变量字段=$(“”);
字段属性(“类型”、“隐藏”);
字段属性(“名称”、“数据”);
field.attr(“value”,转义(JSON.stringify(inputData));
表单追加(字段);
变量字段2=$(“”);
字段2.attr(“名称”、“文件名”);
field2.attr(“值”,文件名);
表格。附加(字段2);
$(document.body).append(表单);
form.submit().remove();
})
var downloadFile=函数(inputData){
//如果为true或false,则checkFileHasResult是ajax调用结果
checkFileHasResult(inputData)。然后(函数(hasFile){
如果(hasFile==true){
//提供扩展名为的文件名
exportToExcel(输入数据,“asdfasdf.csv”);
}
});
};FileResult
var exportToExcel = function (inputData, fileName) {
var path = "url";
var form = $("<form></form>");
form.attr("enctype", "application/x-www-form-urlencoded");
form.attr("method", "post");
form.attr("action", path);
form.attr("accept-charset", "UTF-8");
var field = $("<input></input>");
field.attr("type", "hidden");
field.attr("name", "data");
field.attr("value", escape(JSON.stringify(inputData)));
form.append(field);
var field2 = $("<input></input>");
field2.attr("name", "fileName");
field2.attr("value", fileName);
form.append(field2);
$(document.body).append(form);
form.submit().remove();
var exportToExcel=函数(输入数据,文件名){
var path=“url”;
变量形式=$(“”);
form.attr(“enctype”,“application/x-www-form-urlencoded”);
表格attr(“方法”、“职位”);
form.attr(“动作”,路径);
表格attr(“接受字符集”、“UTF-8”);
变量字段=$(“”);
字段属性(“类型”、“隐藏”);
字段属性(“名称”、“数据”);
field.attr(“value”,转义(JSON.stringify(inputData));
表单追加(字段);
变量字段2=$(“”);
字段2.attr(“名称”、“文件名”);
field2.attr(“值”,文件名);
表格。附加(字段2);
$(document.body).append(表单);
form.submit().remove();
})
var downloadFile=函数(inputData){
//如果为true或false,则checkFileHasResult是ajax调用结果
checkFileHasResult(inputData)。然后(函数(hasFile){
如果(hasFile==true){
//提供扩展名为的文件名
exportToExcel(输入数据,“asdfasdf.csv”);
}
});
};在谷歌上做一个快速搜索,得到了不少结果 在JQuery中,您可以将“window.location”指向控制器中的操作方法,该方法返回一个FileResult。这将为您下载该文件 我建议您向ajax调用返回消息,说明下载是否成功,然后您可以在前端设置某种文本,通知用户此过程失败 下面是我如何做到这一点的。你可以调整它为你工作。下面是控制器方法的一个示例
[HttpGet]
public JsonResult ExportCollection()
{
//Build your excel file, and save it to disk somewhere on server.
//you can also save it in session, depending on size
//Build up response Messages based on success or not
//return json object with your file path
return Json(new { responseMessage = responseMessage }, JsonRequestBehavior.AllowGet);
}
public ActionResult Download(string fileName)
{
return File(model.FilePath, "application/vnd.ms-excel", fileName);
}
然后,使用JQuery和Ajax调用从客户端调用这些操作
$(document).on("click", "#YourButton", function () {
var url = "/YourController/ExportCollection/"
$("#responseText").text("We're getting things ready. Please wait...");
$('#loadingImage').show();
$.ajax({
url: url,
type: "get",
success: function (responseMessage) {
patientCollectionExportSuccess(responseMessage);
}
});
})
//Function responsible for exporting
function patientCollectionExportSuccess(dataReceived) {
var respMessage = dataReceived.responseMessage;
if (respMessage != null) {
if (respMessage != "Error: Not Exported.") {
$("#responseText").text("Download completed.");
$('#loadingImage').hide();
//set window.location to redirect to FileResult, which will download file
window.location = '/PatientListingQuery/Download?fileName=' + respMessage ;
}
else {
$("#responseText").text("Download unsuccessful.");
$('#loadingImage').hide();
$("#responseText").text(dataReceived.responseMessage);
}
}
}
在谷歌上做一个快速搜索,得到了不少结果 在JQuery中,您可以将“window.location”指向控制器中的操作方法,该方法返回一个FileResult。这将为您下载该文件 我建议您向ajax调用返回消息,说明下载是否成功,然后您可以在前端设置某种文本,通知用户此过程失败 下面是我如何做到这一点的。你可以调整它为你工作。下面是控制器方法的一个示例
[HttpGet]
public JsonResult ExportCollection()
{
//Build your excel file, and save it to disk somewhere on server.
//you can also save it in session, depending on size
//Build up response Messages based on success or not
//return json object with your file path
return Json(new { responseMessage = responseMessage }, JsonRequestBehavior.AllowGet);
}
public ActionResult Download(string fileName)
{
return File(model.FilePath, "application/vnd.ms-excel", fileName);
}
然后,使用JQuery和Ajax调用从客户端调用这些操作
$(document).on("click", "#YourButton", function () {
var url = "/YourController/ExportCollection/"
$("#responseText").text("We're getting things ready. Please wait...");
$('#loadingImage').show();
$.ajax({
url: url,
type: "get",
success: function (responseMessage) {
patientCollectionExportSuccess(responseMessage);
}
});
})
//Function responsible for exporting
function patientCollectionExportSuccess(dataReceived) {
var respMessage = dataReceived.responseMessage;
if (respMessage != null) {
if (respMessage != "Error: Not Exported.") {
$("#responseText").text("Download completed.");
$('#loadingImage').hide();
//set window.location to redirect to FileResult, which will download file
window.location = '/PatientListingQuery/Download?fileName=' + respMessage ;
}
else {
$("#responseText").text("Download unsuccessful.");
$('#loadingImage').hide();
$("#responseText").text(dataReceived.responseMessage);
}
}
}
谢谢各位
我找到了解决办法
这对我来说很顺利
我的表单操作指向另一个方法,因此在提交表单之前更新了操作。下载完文件后,我将其设置为旧表单操作
$(document).ready(function () {
$('#excel-button').on('click', function () {
$.ajax({
url: '/MyController/IsData',
type: 'POST',
data: $("#myForm").serialize(),
success: function (response) {
if (response == "True") {
var oldUrl="";
var form1 = $('#myForm');
var frm = document.getElementById('myForm') || null;
if (frm) {
oldUrl = frm.action;
frm.action = '/MyController/GenerateExcel';
}
form1.submit();
frm.action = oldUrl;
$('.error-Message').hide();
} else {
$('.error-Message').show();
}
}
});
});
谢谢各位
我找到了解决办法
这对我来说很顺利
我的表单操作指向另一个方法,因此在提交表单之前更新了操作。下载完文件后,我将其设置为旧表单操作
$(document).ready(function () {
$('#excel-button').on('click', function () {
$.ajax({
url: '/MyController/IsData',
type: 'POST',
data: $("#myForm").serialize(),
success: function (response) {
if (response == "True") {
var oldUrl="";
var form1 = $('#myForm');
var frm = document.getElementById('myForm') || null;
if (frm) {
oldUrl = frm.action;
frm.action = '/MyController/GenerateExcel';
}
form1.submit();
frm.action = oldUrl;
$('.error-Message').hide();
} else {
$('.error-Message').show();
}
}
});
});
是否有其他方法代替保存文件?例如,您可以将文件保存在TempData中。但是,当用户出于任何原因刷新页面时,我相信该文件会消失。保存到磁盘可能更好,下载后,您可以再次从磁盘删除该文件。是否有其他方法代替保存文件?例如,您可以将文件保存到TempData中。但是,当用户出于任何原因刷新页面时,我相信该文件会消失。保存到磁盘可能更好,下载后,您可以再次从磁盘删除该文件。