1
我有一個場景,用戶可以選擇單擊按鈕「下載」,我應該創建一個包含歷史數據的csv文件,然後讓用戶在本地保存文件。由於我之前沒有這樣做,我開始考慮如何做到這一點,基本上遇到了自定義視圖引擎和自定義操作結果。自定義視圖引擎vs自定義操作結果
我現在的問題是這些的好處/壞處是什麼?什麼是最好的方式去?
CSV文件基本上只包含標題和幾千行數據(最多約15列/字段)。所以沒什麼特別的。
我有一個場景,用戶可以選擇單擊按鈕「下載」,我應該創建一個包含歷史數據的csv文件,然後讓用戶在本地保存文件。由於我之前沒有這樣做,我開始考慮如何做到這一點,基本上遇到了自定義視圖引擎和自定義操作結果。自定義視圖引擎vs自定義操作結果
我現在的問題是這些的好處/壞處是什麼?什麼是最好的方式去?
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);
}
看起來是一種很好的方法。我會給它一個去看看它是如何結束的。謝謝! :) – MrW 2010-07-23 10:08:27