2009-07-06 11 views
8

Tengo un formulario que los usuarios deben completar y enviar. La acción del controlador hace algo de trabajo y decide que el usuario puede tener un archivo y así redirige a otra acción que es un FilePathResult.¿Cuál es la forma MVC de enviar un archivo simultáneamente y redirigir a una página nueva?

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

Lo que me gustaría hacer es redirigir al usuario a otra página que, gracias al usuario para descargar el archivo, pero no estoy seguro de cómo llevar a cabo de una manera que "MVC-like".

La única forma en que puedo pensar en la parte superior de mi cabeza es omitir la acción de descarga y en su lugar redirigir a la acción Thank You, y hacer que ThankYou use javascript para enviar el archivo. Pero esto simplemente no me parece muy MVC. ¿Hay un mejor enfoque?

Resultados:

La respuesta aceptada es lo suficientemente correcta, pero yo quería mostrar implementé ella.

Los cambios acción index donde se redirige a:

 return RedirectToAction("Thankyou"); 

he añadido este controlador (y la vista) para mostrar al usuario de cualquier "información de descarga posterior" y decir gracias por la descarga del archivo. El atributo AutoRefresh que obtuve de link text muestra otros usos excelentes.

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

La acción que consiguen es redirigido a la misma como lo era antes:

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

Respuesta

11

Sólo añadir una cabecera a su respuesta, en la acción para su página redireccionada.

googlear ocurrió esta cabecera:

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

En su caso, el URL sería reemplazado por la URL a su acción descarga

Como dice la página que estaba leyendo, el número 5 es el número de segundos para esperar antes de "actualizar" a la url.

Con el archivo de ser una descarga, no se debe mover fuera de su buena página de redirección :)

+0

Gracias ... su respuesta me llevan a una investigación diferente en el que me encontré con esta página: http: //weblogs.asp.net/rashid/archive/2009/04/29/fun-with-http-headers-in-asp-net-mvc-action-filters.aspx –

+1

Genial, me alegro de poder ayudarte. Me gusta el método de atributo. ¿Lo mantiene luciendo bien? Pero no es menos MVC solo para agregar encabezados manualmente si los requiere. – Sekhat

Cuestiones relacionadas