2011-06-06 23 views
5

Actualmente estoy usando project awesome para hacer pop un formulario que solicita un número de cuenta.MVC CSV File Download + Project Awesome

tomo el número y generar un archivo csv y enviar al navegador:

string billcsv = "account_ref,line1,line2,line3" 

var VIRFile = File(new System.Text.UTF8Encoding().GetBytes(billcsv), "text/csv", "billfor" + accnumber+ ".csv") 

return Json(VIRFile); 

me gustaría que el usuario final se le pide que guarde el archivo csv, pero no puedo averiguar quién.

¿Debo crear primero el archivo CSV en el disco y luego pasar la url al archivo a la función de éxito y usar window.open (url) o es posible usar javascript para volver a crear el archivo del resultado json?

JSON Resultado:

{ "FileContents": [65,99,99,111,117,110,116,95,82,69,70,44,73,78,86,79,73,67,69,95 , 84,89,80,69,44,73,78,86,79,73,67,69,95,82,69,70,44,81,84,89,95,79,82,68,69 , 82,44,83,69,82,86,73,67,69,95,84,69,88,84,44,85,78,73,84,95,80,82,73,67,69 , 44,83,69,82,86,73,67,69,95,65,77,79,85,78,84,13,10,114,114,114,44,73,110,118,111,105,99,101,44,86,73,82,49 , 48,50,44,49,44,83,116,97,114,83,104,105,112,32,32,79,110,101,13,10,44,76,79,65,32,45,32,32,109,116,114,115,13,10,44,71 , 82,84,32,45,71,84,44,48,44,48,44,48,13,10,114,114,114,44,73,110,118,111,105,99,101,44,86,73,82,49,48,50,44 , 50,44,66,111,97,116,32,84,114,97,110,115,102,101,114,115,32,72,105,114,101,32,67,104,97,114,103,101,44,50,53,48,46,48,48,4 4,53,48,48,46,48,48,13,10,114,114,114,44,73,110,118,111,105,99,101,44,86,73,82,49,48,50,44,51,44,66,101,114,116,104,105,110,103,32,32, 82,70,65,32,47,32,77,111,68,44,51,53,48,46,48,48,44,49,48,53,48,46,48,48,13,10] , "ContentType": "text/csv", "FileDownloadName": "billfor123.csv"}

Respuesta

11

En primer lugar, no use AJAX para descargar archivos. Use un envío de formulario normal o un anclaje que apunte a la acción del controlador que servirá el archivo. Y luego, en el controlador:

public ActionResult Download(string accnumber) 
{ 
    string billcsv = "account_ref,line1,line2,line3"; 
    var data = Encoding.UTF8.GetBytes(billcsv); 
    string filename = "billfor" + accnumber + ".csv"; 
    return File(data, "text/csv", filename); 
} 

Ahora con el fin de invocar esta acción y que el usuario se le solicite la descarga simplemente crear un enlace:

@Html.ActionLink("Download csv", "Download", new { accnumber = "123" }) 

o si está utilizando un formulario:

@Html.BeginForm("Download", "SomeController") 
{ 
    @Html.TextBox("accnumber") 
    <input type="submit" value="Download CSV" /> 
} 
+0

La razón por la que utilizo un pop-up forma es porque los usuarios tiene que introducir un número de cuenta antes de que pueda generar el CSV. el número de cuenta forma parte del campo account_ref. el número de cuenta no se conoce hasta que el usuario ingrese el número de cuenta. – uk101man

+0

@ uk101man, su problema no proviene del hecho de que está utilizando un formulario emergente. Viene del hecho de que estás enviando este formulario usando AJAX. No deberías estar haciendo esto. Use un helper '@ Html.BeginForm()' para generar el formulario y no use ningún AJAX para publicarlo. –

+0

pero la forma ajax es lo que el proyecto usa increíble, creo. Cuando implemente su idea, el contenido del archivo csv se devuelve a la ventana emergente. – uk101man

0

El envío del formulario con AJAX tiene sus desventajas. No deberías estar haciendo esto. Prefiero usar @ Html.BeginForm() helper para generar el formulario y enviar los datos usando el evento button.

Esperanza esto ayuda