2009-07-06 21 views
8

Ho un modulo che gli utenti devono compilare e inviare. L'azione del controller fa un po 'di lavoro e decide che l'utente può avere un file e quindi reindirizza a un'altra azione che è FilePathResult.Qual è il modo MVC di inviare simultaneamente un file e reindirizzare a una nuova pagina?

[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"); 
    } 

Quello che vorrei fare è reindirizzare l'utente ad un'altra pagina che grazie l'utente per il download ma non sono sicuro di come realizzare questo in un modo "MVC-like".

L'unico modo in cui riesco a pensare in cima alla mia testa è saltare l'azione Download e reindirizzare invece all'azione ThankYou, e avere la view ThankYou usare javascript per inviare il file. Ma questo non mi sembra molto MVC. C'è un approccio migliore?

Risultati:

La risposta accettata è abbastanza corretto, ma ho voluto mostrare che ho implementato.

I cambiamenti azione index dove reindirizza a:

 return RedirectToAction("Thankyou"); 

ho aggiunto questo controller (e vista) per mostrare all'utente alcuna "informazione successiva download" e per dire grazie per il download. L'attributo AutoRefresh che ho acquisito da link text mostra alcuni altri usi eccellenti.

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

L'azione che reindirizzati è la stessa come era prima:

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

risposta

11

Basta aggiungere un colpo di testa alla risposta, nell'azione per la vostra pagina reindirizzata.

Googling si avvicinò con questa intestazione:

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

Nel tuo caso l'URL sarebbe stato sostituito con l'URL per la vostra azione scaricare

come pagina che stavo leggendo, dice, il numero 5 è il numero di secondi da attendere prima di "aggiornare" l'url.

Con il file di essere un download, non si dovrebbe spostare il vostro bella pagina di reindirizzamento :)

+0

Grazie ... la tua risposta mi portano a un po 'diverso ricerca in cui ho trovato questa pagina: http: //weblogs.asp.net/rashid/archive/2009/04/29/fun-with-http-headers-in-asp-net-mvc-action-filters.aspx –

+1

Cool, felice di poterti aiutare. Mi piace il metodo dell'attributo. Lo fa sembrare bello. Ma non è meno MVC solo per aggiungere le intestazioni manualmente se necessario. – Sekhat

Problemi correlati