Domanda

Ho uno scenario in cui l'utente ha la possibilità di fare clic sul pulsante "Download" e dovrei creare un file CSV, che contiene i dati della cronologia, quindi consentono l'utente salvare il file localmente.Mentre non l'ho fatto prima, ho iniziato a guardarmi intorno a come farlo e fondamentalmente è arrivato sia attraverso il motore di visualizzazione personalizzato e il risultato dell'azione personalizzata.

La mia domanda ora è qual è il vantaggio / svantaggi con questi?Qual è il modo preferito per andare?

Il file CSV, fondamentalmente contenente intestazioni e dati (fino a circa 15 colonne / campi) con poche migliaia di righe.Quindi niente di speciale davvero.

È stato utile?

Soluzione

Probabilmente andrei a un risultato d'azione personalizzato (la serializzazione effettiva nel mio esempio è fatto 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);
    }
}
.

Si potrebbe persino prettificare questa dichiarazione di ritorno (i generici sono brutti e superflui in questo caso) utilizzando un metodo di estensione:

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

e poi semplicemente:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top