2010-02-10 10 views
13

Das Setup:ASP.NET MVC-Controller filecontent Action über AJAX genannt

Der Controller enthält ein Verfahren, das ein public ActionResult SaveFile()FileContentResult zurückgibt.

Was funktioniert:

Die Ansicht enthält eine Form, die an dieser Aktion einreicht. Das Ergebnis ist dieser Dialog: enter image description here

Was funktioniert nicht:

Die Ansicht enthält einige Javascript einen AJAX-Aufruf zu der gleichen Controller-Aktion zu tun, wo das Formular veröffentlichen würde. Anstatt den oben erwähnten Dialog oder sogar die AJAX-Erfolgsfunktion auszulösen, löst die Antwort die AJAX-Fehlerfunktion aus, und XMLHttpRequest.responseText enthält die Dateiantwort.

Was ich tun muss:

die Anfrage für die Datei Make AJAX verwenden, und mit dem gleichen Ergebnis am Ende als wenn ein Formular abgeschickt werden. Wie kann ich sicherstellen, dass die AJAX-Anfrage den Dialog zum Senden eines Formulars enthält?

+0

Warum können Sie nicht nur nicht-Ajax-Aufruf verwenden? – LukLed

+0

Ich kann, aber ich möchte eine andere Verarbeitung in der JavaScript-Funktion zu tun, sobald der Speichervorgang abgeschlossen ist, wie das Formular entsperren, die ich vor dem Speichern blockiert. – Rick

+0

OK, Sie können also zuerst ajax SaveFile aufrufen. SaveFile gibt True/False zurück. Wenn es wahr zurückgibt, rufen Sie non-ajax GET auf, um die Datei zu erhalten. – LukLed

Antwort

16

Hier ist ein schnelles Beispiel, das ich erfunden habe. Dies ist das Konzept, über das LukLed mit dem Aufruf von SaveFile gesprochen hat, aber keine Dateiinhalte über Ajax zurückgibt und stattdessen zum Download umleitet.

Hier ist der Ansicht Code:

<script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    $(function() { 
     // hide form code here 

     // upload to server 
     $('#btnUpload').click(function() { 
      $.ajax({ 
       type: 'POST', 
       dataType: 'json', 
       url: '<%= Url.Action("SaveFile", "Home") %>', 
       success: function(fileId) { 
        window.location = '<%= Url.Action("DownloadFile", "Home") %>?fileId=' + fileId; 
       }, 
       error: function() { 
        alert('An error occurred uploading data.'); 
       } 
      }); 
     }); 
    }); 
</script> 

<% using (Html.BeginForm()) { %> 

    <div>Field 1: <%= Html.TextBox("field1") %></div> 

    <div>Field 2: <%= Html.TextBox("field2") %></div> 

    <div>Field 3: <%= Html.TextBox("field3") %></div> 

    <button id="btnUpload" type="button">Upload</button> 

<% } %> 

Hier ist der Code-Controller:

[HandleError] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public JsonResult SaveFile(string field1, string field2, string field3) 
    { 
     // save the data to the database or where ever 
     int savedFileId = 1; 

     // return the saved file id to the browser 
     return Json(savedFileId); 
    } 

    public FileContentResult DownloadFile(int fileId) 
    { 
     // load file content from db or file system 
     string fileContents = "field1,field2,field3"; 

     // convert to byte array 
     // use a different encoding if needed 
     var encoding = new System.Text.ASCIIEncoding(); 
     byte[] returnContent = encoding.GetBytes(fileContents); 

     return File(returnContent, "application/CSV", "test.csv"); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 
+0

Nate, danke für die Bereitstellung eines so detaillierten Beispiels. Ich weiß es zu schätzen und bedanke mich auch bei LukLed dafür, dass Sie fleißig versucht haben, Ihre Lösung zu erklären. Der Punkt, der nicht einbrach, war, dass der erste Anruf die zu speichernden Daten vorbereitete und der zweite Anruf den Download. – Rick

+0

Ich war dort, bevor ich meinen Kopf gegen die Wand hämmerte und WTF zu mir selbst sagte, ohne sich Sorgen zu machen. Froh, dass ich Helfen kann. –

Verwandte Themen