質問

私はユーザーが「ダウンロード」をクリックするオプションを持っているシナリオがあり、履歴データを含む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);
    }
}
.

拡張方法を使用して、このRETURNステートメント(ジェネリックスは醜く、余分なものです)を構わせることもできます。

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