我试图在某种程度上复制我在this question中看到的内容,特别是在this answer中,但不完全相同。 我的意图是,如果zip没有文件(可能因为文件夹可能是空的而发生)我想返回一个警报,因此警告用户当时无法获取文件。 但是我在重定向点上缺少,我不希望警报将用户重定向到引用操作的空白页面,我希望它留在页面中,也是由于某些过滤器。 这可能吗?我无法找到任何可以阻止重定向发生的事情。
这是我的Action Controller代码:
public ActionResult DownloadZip(List<int> things)
{
// Create zip with files
if (!zip.Any())
{
return Content(@"<script language='javascript' type='text/javascript'>
alert('Message');
</script>
");
}
// Return zip
}
以下是来自视图的电话:
$("#btnExportToZip").on("click", function (e) {
var grid = $("#gridThings").data("kendoGrid");
var items = grid.dataSource.data();
var lstIds = [];
$.each(items, function (index, elem) {
if (elem.Checked) {
lstIds.push(elem.Id);
}
});
if (lstIds.length > 0) {
var params = lstIds.join("&listAmostras=")
var url = '/Search/DownloadZip?listAmostras=' + params;
window.location.href = url;
}
});
答案 0 :(得分:0)
如果您在此处进行重定向,则在确定zip文件为空后将其取回已为时已晚。这里你最好的选择可能是下载AJAX文件。但请记住,这将要求浏览器支持HTML5文件API,因此IE 9及以下版本已经完成。
$.ajax({
url: url,
async: false,
xhrFields: {
responseType: 'blob'
},
success: function (data) {
var a = document.createElement('a');
var url = window.URL.createObjectURL(data);
a.href = url;
a.download = 'myfile.pdf';
a.click();
window.URL.revokeObjectURL(url);
}
});
基本上它的作用是通过AJAX请求zip文件。一旦接收到文件数据,就会向DOM添加锚链接(不可见)并动态“点击”以近似用户单击指向静态文件的链接的行为。换句话说,一旦AJAX请求成功完成,就会弹出下载提示。但是,此代码仅删除了重定向的需要。只有当zip文件中包含某些内容时,您仍然需要有条件地弹出下载。有两种方法可以实现这一点。
在AJAX的success
回调中,您可以使用检查data.size > 0
的条件将代码包装在那里。但是,这可能实际上不起作用。我从来没有看过一个空的zip文件,但完全有可能是二进制文件中的文件头会导致blob的大小实际上大于零,即使它是“空的”。
更好的方法是在zip文件为空时在zip操作中返回错误响应。在我的脑海中,我不确定最适合的错误响应代码是什么,但400-500范围内的任何内容都可用于触发相应的AJAX回调。然后,您只需要为此AJAX添加error
处理程序。在该处理程序中,您可以通知用户但是您不希望下载,因为zip将为空。
答案 1 :(得分:0)
根据我的理解,警报会将用户重定向到空白页面,因为在javascript中您有行window.location.href = url;
,可能会再次重定向到显示警报的同一操作。
因此,尝试将不同的URL提供给window.location.href
,例如: window.location.href = '../somecontroller/someaction';
感谢
KARTHIK