2009-07-06 10 views
8

Ich habe ein Formular, das Benutzer ausfüllen und übermitteln müssen. Die Controller-Aktion führt eine gewisse Arbeit aus und entscheidet, dass der Benutzer eine Datei haben kann und so zu einer anderen Aktion umgeleitet wird, bei der es sich um ein FilePathResult handelt.Wie kann MVC Dateien gleichzeitig senden und auf eine neue Seite umleiten?

[CaptchaValidator] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(FormCollection collection) 
    { 
     // do some stuff ... 
     return RedirectToAction("Download"); 
    } 


    [AcceptVerbs(HttpVerbs.Get)] 
    public FilePathResult Download() 
    { 
     var fileName = "c:\foo.exe"; 
     return File(fileName, "application/octet-stream", "installer.exe"); 
    } 

Was würde ich zu tun ist, den Benutzer zu einer anderen Seite, die durch den Benutzer zum Herunterladen der Datei umleiten, aber ich bin nicht sicher, wie das in einer „MVC-like“ Art und Weise zu erreichen.

Die einzige Möglichkeit, die ich mir vorstellen kann, ist, die Download-Aktion zu überspringen und stattdessen auf die ThankYou-Aktion umzuleiten, und die ThankYou-Ansicht verwenden Javascript verwenden, um die Datei zu senden. Aber das scheint mir nicht sehr MVC. Gibt es einen besseren Ansatz?

Ergebnisse:

Die akzeptierte Antwort richtig genug ist, aber ich wollte ich es umgesetzt zeigen.

die Index Aktion ändert, wo es Umleitungen an:

 return RedirectToAction("Thankyou"); 

Ich habe diesen Controller (und Ansicht), um den Benutzer zu zeigen, jeder „post Download-Informationen“ und Dank zu sagen für die Datei herunterzuladen. Das AutoRefresh-Attribut, das ich von link text gegriffen habe, zeigt einige andere ausgezeichnete Verwendungen.

[AutoRefresh(ControllerName="Download", ActionName="GetFile", DurationInSeconds=3)] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Thankyou() 
    { 
     return View(); 
    } 

Die Aktion, die das gleiche ist erhalten umgeleitet, wie es vorher war:

[AcceptVerbs(HttpVerbs.Get)] 
    public FilePathResult GetFile() 
    { 
     var fileName = "c:\foo.exe"; 
     return File(fileName, "application/octet-stream", "installer.exe"); 
    } 

Antwort

11

einfach einen Header auf Ihre Antwort, für Ihre Weitergeleitete Seite in der Aktion hinzuzufügen.

Googeln mit diesem Header kam:

Refresh: 5; URL=http://host/path 

In Ihrem Fall die URL würde mit der URL des Download Aktion

ersetzt werden, wie die Seite, die ich so lese, die Zahl 5 ist die Anzahl der Sekunden, die gewartet werden soll, bevor die URL aktualisiert wird.

Mit der Datei ein Download ist, sollte es nicht, dass Sie von Ihrer schönen umadressierenseite bewegen :)

+0

Dank ... Ihre Antwort mich zu einigen anderen Forschungs führen, in denen ich diese Seite gefunden: http: //weblogs.asp.net/rashid/archive/2009/04/29/fun-with-http-headers-in-asp-net-mvc-action-filters.aspx –

+1

Cool, froh, dass ich helfen konnte. Ich mag die Attributmethode. Sieht gut aus. Aber es ist nicht weniger MVC, nur Kopfzeilen manuell hinzuzufügen, wenn Sie sie benötigen. – Sekhat

Verwandte Themen