2012-12-30 14 views
11

Chciałbym zapewnić operację pobierania plików za pomocą połączenia jQuery AJAX z niektórych params pod MVCJak wdrożyć do pobrania pliku z AJAX i MVC

przykład

(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?? 
} 

ja zwykle po prostu zrobić mój pobierz plik, taki jak:

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

, jednak w powyższym przypadku data będzie dynamiczna.

Jeśli nie używam ajax, jaki byłby preferowany sposób przekazywania parametrów do kontrolera MVC za pomocą javascript?

przykład:

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

zakładając data jest 25.12.2012 byłoby to produkować

mycontroller/GetFile/12/25/2012 

MVC byłoby traktować to jako trzy params?

+0

Odpowiedź na swoje pytanie znajduje się pod linkiem [this] [1]. [1]: http://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-mvc/5830215#5830215 –

+0

ile trzeba "hackable" URL , Nie jestem pewien, czy musisz to robić w ten sposób. Po prostu podaj datę jako parametr metody kontrolera, a następnie użyj sugerowanej implementacji FileResult. Może robisz to trudniej, niż powinno być? –

Odpowiedz

11

Co skończyło się robi dzwoni mój kontroler z mojego javascript, takich jak:

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

window.location = url; 

mycontroller.cs

public void GetFile(DateTime startDate) 
{ 

} 

Mój oryginalny troską było z parametrami daty. Nie chciałem tego analizować.

+2

Najbardziej po prostu działające rozwiązanie w mojej opinii :) –

+0

Jeszcze jeden komentarz, pomimo różnych dat na świecie, jest teraz bardzo powszechnie akceptowany wszędzie, gdzie używa się ISO-8601 zamiast jakiegokolwiek innego formatu. Niestety MVC opakowuje daty w dziwny sposób i nie jest to najbardziej popularny. Sugeruję, abyś zawsze używał ISO-8601, ponieważ możesz w przyszłości łatwiej zmienić kontroler w przyszłości. –

+0

Działa to idealnie do pobierania pliku, w którym nie ma połączenia z jQuery Ajax. Dziękuję za to zwięzłe, ale eleganckie rozwiązanie! – PhillipPDX

1

Twoja metoda działania kontrolera powinna zwrócić wartość FileResult zamiast pustą. I nie ma potrzeby tego robić poprzez AJAX - w rzeczywistości nie chcesz tego robić z AJAX. Musisz mieć włączoną przeglądarkę, aby zapewnić użytkownikowi okno dialogowe pobierania.

zobacz te linki:

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

File download in Asp.Net MVC 2

Mam nadzieję, że to pomaga.

+0

Naprawdę utknąłem, jak przekazywać parametry do kontrolera MVC. Lub jaki jest najlepszy sposób. – Arcadian

+0

Poniższa odpowiedź Romias pokazuje, jak przekazywać wartości do metody akcji za pomocą ActionLink. –

2

Możesz użyć metody File klasy kontrolera, aby zwrócić plik z powrotem do przeglądarki.

Poniższy przykład zwraca plik pdf.

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

Przyjmując metodę repositary.GetFileDedetails zwraca szczegóły pliku z identyfikatora.

Możesz również zwrócić plik z fizycznej lokalizacji (ścieżki) lub strumienia. Sprawdź wszystkie overloads metody File i użyj odpowiedniej.

Nie ma to nic wspólnego z ajaxem. to jest normalne żądanie z domeny GET przez przeglądarkę.

3

Korzystanie pomocnika actionlink można przekazać wiele params do kontrolera:

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

Więc w twoim przypadku:

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

jQuery można zmienić wartość startDate w łącze z treścią selektora daty lub pola tekstowego.

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

Następnie w kontroler, wystarczy użyć jednej z pozostałych odpowiedzi tutaj o FileResult.

Nadzieja to pomóc ...

+0

To działa. Dzięki –

Powiązane problemy