2017-07-05 2 views
0

Ich versuche etwas zu replizieren, was ich in this question sah, vor allem in this answer, aber nicht ganz dasselbe. Meine Absicht ist, wenn die Zip keine Dateien hat (kann passieren, weil der Ordner leer sein könnte) Ich möchte eine Warnung zurückgeben, so dass der Benutzer gewarnt wird, dass es nicht möglich ist, die Datei zu der Zeit zu erhalten. Aber ich vermisse den Umleitungspunkt, ich möchte nicht, dass die Warnung den Benutzer auf eine leere Seite umleiten, die die Aktion verweist, ich möchte, dass sie auf der Seite bleibt, auch wegen einiger Filter. Ist das möglich? Ich konnte nichts finden, was die Weiterleitung verhindern würde.Zurück Inhalt mit Warnung in Controller

Hier ist mein der Code 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 
    } 

Hier ist der Aufruf aus der Sicht:

$("#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; 
    } 
}); 

Antwort

0

Wenn Sie eine Umleitung zu tun, wie Sie hier, es ist zu spät tun zu nimm es zurück, nachdem du festgestellt hast, dass die Zip-Datei leer ist. Ihre beste Wette hier ist wahrscheinlich, einen AJAX-Dateidownload zu machen. Beachten Sie jedoch, dass dies erfordert, dass der Browser die HTML5-Datei-API unterstützt, also IE 9 und darunter sind out.

$.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); 
    } 
}); 

Im Wesentlichen das, was tut, ist die Zip-Datei über AJAX anfordern. Sobald die Dateidaten empfangen wurden, wird ein Anker-Link zum DOM hinzugefügt (nicht sichtbar) und dynamisch "angeklickt", um das Verhalten des Benutzers anzugleichen, klicken Sie auf einen Link zu einer statischen Datei. Mit anderen Worten, eine Download-Aufforderung wird angezeigt, sobald die AJAX-Anfrage erfolgreich abgeschlossen wurde. Dieser Code entfernt jedoch nur die Notwendigkeit, umzuleiten. Sie müssen den Download nur dann mit einer Bedingung beenden, wenn die Zip-Datei etwas enthält. Es gibt zwei Möglichkeiten, wie Sie das erreichen können.

  1. Im success Rückruf des AJAX, würden Sie den Code dort in einem bedingten wickeln, das die data.size > 0 prüft. Das könnte jedoch nicht funktionieren. Ich habe nie eine leere Zip-Datei angeschaut, aber es ist durchaus möglich, dass es Dateiköpfe in der Binärdatei gibt, die bewirken würden, dass der Blob tatsächlich eine Größe größer als Null hat, obwohl er "leer" ist.

  2. Der bessere Ansatz ist, eine Fehlerantwort in Ihrer Zip-Aktion zurückzugeben, wenn die Zip-Datei leer ist. Aus der Spitze meines Kopfes, bin ich nicht sicher, was der entsprechende Fehler-Antwort-Code wäre, aber alles in 400-500 Bereich funktioniert für die Auslösung der entsprechenden AJAX-Rückruf. Dann müssen Sie nur hinzufügen und error Handler zu diesem AJAX. In diesem Handler könnten Sie dann den Benutzer darüber informieren, dass es keinen Download gibt, da die Zip-Datei leer sein würde.

+0

Having a Guardin mir antworten, ‚wie Kampf dat!Nun, das Problem, dem wir gegenüberstehen, ist genau die Browser-Version einiger Clients, da viele ihrer Profis noch Windows XP-Computer verwenden. Wir müssen also berücksichtigen, dass der IE immer noch in Version 8 oder weniger verwendet wird. Ich habe bereits den 2. Punkt gemacht, einen 404-Fehler zu geben, um zu benachrichtigen, dass Dateien nicht gefunden wurden, um eine ZIP zu erstellen. Wahrscheinlich wird auf diese Lösung zurückgegriffen, da sie am besten funktionierte. –

0

Gemäß meinem Verständnis ist ansprechbar den Benutzer auf die leere Seite umleiten, weil in der JavaScript Sie die Zeile window.location.href = url; haben, die wieder auf die gleiche Aktion umleiten könnte, welche die Warnung zeigt.

So versuchen, die verschiedenen URL zum window.location.href

für ex zu geben:window.location.href = '../somecontroller/someaction';

dank

Karthik

+0

Die dort verwendete 'window.location.href = url' dient dazu, den Aufruf an die Aktion zu senden und die erforderlichen IDs zu senden, um die zugehörigen Dateien in die Zip-Datei aufzunehmen, also bevor ich versuche, die Warnung zu verwenden. –

Verwandte Themen