カスタムビューエンジン対カスタムアクション結果
-
27-09-2020 - |
質問
私はユーザーが「ダウンロード」をクリックするオプションを持っているシナリオがあり、履歴データを含む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);
}
. 所属していません StackOverflow