Pregunta

Tengo un escenario donde el usuario tiene la opción de hacer clic en el botón "Descargar" y debería crear un archivo CSV, que contenga datos de historial y luego deje que el usuario guarde el archivo localmente.Como no he hecho esto antes, comencé a mirar alrededor de cómo hacerlo y básicamente se encontró con el motor de la vista personalizada y el resultado de la acción personalizada.

Mi pregunta ahora es ¿cuáles son los beneficios / desventajas con estos?¿Cuál es la forma preferida de ir?

El archivo CSV, básicamente es solo que contiene encabezados y datos (hasta aproximadamente 15 columnas / campos) con unas pocas mil filas.Así que nada especial realmente.

¿Fue útil?

Solución

Probablemente vaya a un resultado de acción personalizada (la serialización real en mi ejemplo se realiza con filehelpers ):

public class CsvResult<T> : ActionResult
{
    public IEnumerable<T> Records { get; private set; }
    public CsvResult(IEnumerable<T> records)
    {
        Records = records;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "text/csv";
        var engine = new FileHelperEngine(typeof(T));
        engine.WriteStream(response.Output, Records);
    }
}

[DelimitedRecord(",")] 
public class Customer 
{
    public int Id { get; set; }
    public string Name { get; set; }         
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var customers = new[]
        {
            new Customer { Id = 1, Name = "customer 1" },
            new Customer { Id = 2, Name = "customer 2" },
        };
        return new CsvResult<Customer>(customers);
    }
}

Incluso podría preparar esta declaración de devolución (los genéricos son feos y superfluos en este caso) utilizando un método de extensión:

public static class ControllerExtensions
{
    public static ActionResult Csv<T>(this Controller controller, IEnumerable<T> records)
    {
        return new CsvResult<T>(records);
    }
}

y luego simplemente:

public ActionResult Index()
{
    var customers = new[]
    {
        new Customer { Id = 1, Name = "customer 1" },
        new Customer { Id = 2, Name = "customer 2" },
    };
    return this.Csv(customers);
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top