2010-02-10 14 views
13

Il setup:ASP.NET MVC controller fileContent ActionResult chiamato tramite la tecnologia AJAX

Il controller contiene un metodo che restituisce un public ActionResult SaveFile()FileContentResult.

Ciò che funziona:

La vista contiene una forma, che sottopone a questa azione. Il risultato è questa finestra di dialogo: enter image description here

cosa non funziona:

la vista contiene alcuni javascript per fare una chiamata AJAX per la stessa azione di controllo in cui la forma sarebbe postare. Invece di attivare la suddetta finestra di dialogo, o anche la funzione AJAX success, la risposta attiva la funzione di errore AJAX e il XMLHttpRequest.responseText contiene la risposta del file.

Cosa devo fare:

Fai la richiesta per il file utilizzando AJAX, e finiscono con lo stesso risultato al momento della presentazione di un modulo. Come posso fare in modo che la richiesta AJAX fornisca la finestra di dialogo che mostra l'invio di un modulo?

+0

Perché non puoi semplicemente usare chiamata non ajax? – LukLed

+0

Posso, ma voglio fare qualche altra elaborazione nella funzione javaScript una volta che il salvataggio è stato completato, come sbloccare il modulo, che ho bloccato prima di salvare. – Rick

+0

OK, quindi è possibile prima chiamare ajax SaveFile. SaveFile restituirà vero/falso. Quando restituisce true, si chiama GET non Ajax per ottenere il file. – LukLed

risposta

16

Ecco un breve esempio che ho inventato. Questo è il concetto di cui parlava LukLed con la chiamata a SaveFile ma che non restituisce il contenuto del file tramite ajax e invece reindirizza al download.

Ecco il codice della vista:

<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> 

<% } %> 

Ecco il codice di controllo:

[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, grazie per aver fornito un esempio così dettagliato. Lo apprezzo e ringrazio anche LukLed per aver cercato diligentemente di spiegare la tua soluzione. Il punto che non stava affondando era che la prima chiamata preparava i dati da salvare e la seconda chiamata il download. – Rick

+0

Sono stato lì prima di sbattere la testa contro il muro dicendo WTF a me stesso cercando di capire, senza preoccupazioni. Felice di aiutare. –

Problemi correlati