Question

J'ai un scénario où l'utilisateur a la possibilité de cliquer sur le bouton "Télécharger" et je dois créer un fichier CSV, contenant des données d'historique, puis laissez l'utilisateur enregistrer le fichier localement.Comme je ne l'ai pas fait auparavant, j'ai commencé à regarder autour de vous comment faire cela et est fondamentalement survenu sur le moteur de vision personnalisé et le résultat d'action personnalisé.

Ma question maintenant est ce qui est l'avantage / les inconvénients avec ceux-ci?Quel est le moyen préféré d'aller?

Le fichier CSV ne contient essentiellement que des en-têtes et des données (jusqu'à environ 15 colonnes / champs) avec quelques milliers de lignes.Donc, rien de spécial vraiment.

Était-ce utile?

La solution

J'irais probablement pour un résultat d'action personnalisé (la sérialisation réelle dans mon exemple est effectuée avec 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);
    }
}

Vous pouvez même me contenter de cette déclaration de retour (les génériques sont laides et superflus dans ce cas) en utilisant une méthode d'extension:

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

et ensuite simplement:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top