在Controller中通过警报返回内容

时间:2017-07-05 16:10:02

标签: javascript c# asp.net-mvc

我试图在某种程度上复制我在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;
    }
});

2 个答案:

答案 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文件中包含某些内容时,您仍然需要有条件地弹出下载。有两种方法可以实现这一点。

  1. 在AJAX的success回调中,您可以使用检查data.size > 0的条件将代码包装在那里。但是,这可能实际上不起作用。我从来没有看过一个空的zip文件,但完全有可能是二进制文件中的文件头会导致blob的大小实际上大于零,即使它是“空的”。

  2. 更好的方法是在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