Pergunta

Eu tenho um cenário onde o usuário tem a opção de clicar no botão "download" e que eu deveria criar um arquivo csv que contém os dados do histórico, e, em seguida, permitir que o usuário salve o arquivo localmente.Como eu ainda não tiver feito isso antes, eu comecei a olhar ao redor para saber como fazer isso e, basicamente, veio em ambos Mecanismo de Exibição Personalizado e Personalizado Resultado da Ação.

A minha pergunta agora é qual é a vantagem e desvantagens com estes?Qual é a melhor maneira de ir?

O arquivo CSV, é, basicamente, apenas contém os cabeçalhos e dados (até cerca de 15 colunas/campos), com alguns milhares de linhas.portanto, nada de realmente especial.

Foi útil?

Solução

Eu, provavelmente, ir para uma ação personalizada resultado (reais serialização no meu exemplo, é feito com 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);
    }
}

Você poderia até mesmo de embelezar esta instrução de retorno (genéricos são feios e supérfluo neste caso) usando um método de extensão:

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

e, em seguida, simplesmente:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top