Пользовательская просмотр двигателя против пользовательского результата действий

StackOverflow https://stackoverflow.com/questions/3310698

Вопрос

У меня есть сценарий, в котором пользователь имеет возможность щелкнуть кнопку «Загрузить», и я должен создать файл CSV, который содержит данные истории, а затем позволить пользователю сохранить файл локально.Поскольку я не сделал этого раньше, я начал оглянуться за то, как это сделать и в основном наступил как на нестандартном режиме просмотра двигателя, так и на заказ результатом действий.

Мой вопрос сейчас - это то, что это выгодно / недостатки с этим?Что является предпочтительным способом идти?

Файл CSV, в основном просто содержит заголовки, а данные (до около 15 столбцов / полей) с несколькими тысячами строк.Так что ничего особенного на самом деле.

Это было полезно?

Решение

Я, вероятно, пошлю на пользовательский результат действий (фактическая сериализация в моем примере выполняется с 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);
    }
}
.

Вы могли бы даже придумать, что это оператор возврата (дженерики некрасивые и лишние в этом случае) с помощью метода расширения:

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

а потом просто:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top