2012-12-30 12 views
11

vorrei fornire un'operazione di download di file utilizzando la chiamata jQuery AJAX con alcuni params sotto MVCCome implementare scaricare file con AJAX e MVC

esempio

(javascript) 
function DoDownload(startDate) { 

    $.ajax({ 
    url:"controller/GetFile/", 
    data: {startDate:startDate} 
    ... 
    }); 

} 

C# Controller Code 

public void GetFile(string startDate) { 

    var results = doQuearyWith(startDate); 

    // Create file based on results 

    .... 
    // HOw do I tell the server to make this a file download?? 
} 

Io di solito vorrei solo fare il mio scarica il documento di un collegamento come ad esempio:

<a h r e f="mycontroller/getfile/1"/>Download</a> 

ma nel caso precedente la data sarà dinamico.

Se non uso ajax, quale sarebbe il modo preferito per passare i parametri al controller MVC utilizzando javascript?

esempio:

window.location = "mycontroller/GetFile/" + $("#fromDate").val(); 

assumendo la data è 2012/12/25 sarebbe questo produrre

mycontroller/GetFile/12/25/2012 

sarebbe MVC trattare questo come tre params?

+0

La risposta alla tua domanda può essere trovata al link [this] [1]. [1]: http://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-mvc/5830215#5830215 –

+0

A meno che non avete bisogno di un URL "hackable" , Non sono sicuro che tu abbia bisogno di farlo in questo modo. Basta passare la data come parametro a un metodo controller e quindi utilizzare l'implementazione FileResult suggerita. Potresti renderlo più difficile di quanto dovrebbe essere? –

risposta

11

Quello che ho finito per fare è chiamare il mio controller dal mio javascript come:

var url = "/mycontroller/GetFile?startDate=" + $("#mydate").val() + etc... 

window.location = url; 

mycontroller.cs

public void GetFile(DateTime startDate) 
{ 

} 

La mia preoccupazione originale era con i parametri della data. Non volevo doverlo analizzare.

+2

La soluzione più semplice a mio parere :) –

+0

Un altro commento, nonostante le diverse date nel mondo, è ormai molto accettato ovunque per utilizzare ISO-8601 invece di qualsiasi altro formato. Sfortunatamente MVC avvolge le date in un modo strano e non è esattamente il più popolare. Ti suggerisco di usare sempre ISO-8601 perché puoi cambiare il controller in futuro in un modo più semplice. –

+0

Questo funziona perfettamente per scaricare un file in cui una chiamata Ajax jQuery non lo fa. Grazie per questa soluzione semplice ma elegante! – PhillipPDX

1

Il metodo di azione del controllore deve restituire un FileResult anziché uno vuoto. E non c'è bisogno di farlo via AJAX - infatti, non vuoi farlo con AJAX. Avrai bisogno del browser in questione in modo che sappia fornire una finestra di download per l'utente.

vedere questi link:

Handling an ASP.NET MVC FileResult returned in an (jQuery) Ajax call

File download in Asp.Net MVC 2

Spero che questo aiuta.

+0

Sono davvero bloccato su come passare i parametri al controller MVC. O qual è il modo migliore. – Arcadian

+0

La risposta di Romias qui sotto mostra come passare valori al tuo metodo di azione usando ActionLink. –

2

È possibile utilizzare il metodo File della classe controller per restituire un file al browser.

Il seguente esempio restituisce un file pdf.

public ActionResult GetFile(int id) 
{ 
    var fileInfo=repositary.GetFileDedetails(id); 
    var byteArrayOFFile=fileInfo.FileContentAsByteArray(); 
    return File(byteArrayOFFile,"application/pdf","yourFriendlyName.pdf"); 
} 

metodo Supponendo repositary.GetFileDedetails restituisce i dettagli del file dalla id.

È inoltre possibile restituire il file da una posizione fisica (un percorso) o uno stream. Controllare tutti gli overloads del metodo File e utilizzarne uno appropriato.

Questo non ha nulla a che fare con ajax. questa è normale richiesta GET su un browser.

3

Utilizzando l'aiutante ActionLink, è possibile passare più params al controller:

HtmlHelper.ActionLink(
    string linkText, 
    string actionName, 
    string controllerName, 
    object routeValues, 
    object htmlAttributes 
) 

Quindi nel tuo caso:

@Html.ActionLink("Download file", "GetFile", "MyController", new { startDate = "##" }, new { id="mydownloadlink" }) 

utilizzando jQuery è possibile modificare il valore della startDate nel link con il contenuto della tua agenda o della tua casella di testo.

$("#mydownloadlink").attr("href").replace("##", $("#yourdatetexbox").val); 

Poi, nel controller, basta usare uno degli altri risposte qui, su FileResult.

Spero che questo aiuto si ...

+0

Funziona.Grazie –