如何在MVC中使用Ajax下载文件。如果没有数据生成文件则显示错误标签。 我正在尝试使用返回File的动作结果方法。我可以下载文件。但如果没有要下载的文件,则不想刷新页面。 我的代码就像
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.如果没有数据,则显示错误标签
答案 0 :(得分:0)
函数返回类型为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 downloadFile = function(inputData){ // checkFileHasResult是ajax调用结果,如果为true或false checkFileHasResult(inputData).then(function(hasFile){ if(hasFile === true){ //给出带扩展名的文件名 exportToExcel(inputData,&#34; asdfasdf.csv&#34;); } }); };
答案 1 :(得分:0)
在Google中进行快速搜索,提出了不少结果,this提问。
在JQuery中,您可以将“window.location”指向控制器中的action方法,该方法返回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);
}
}
}
答案 2 :(得分:0)
谢谢你们
我得到了解决方案 它对我很有帮助....
我的表单操作指向另一个方法,因此在提交表单之前更新了操作。在文件下载后,我将其设置为旧表单操作。
$(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();
}
}
});
});