2010-07-22 67 views
1

我有一个场景,用户可以选择单击按钮“下载”,我应该创建一个包含历史数据的csv文件,然后让用户在本地保存文件。由于我之前没有这样做,我开始考虑如何做到这一点,基本上遇到了自定义视图引擎和自定义操作结果。自定义视图引擎vs自定义操作结果

我现在的问题是这些的好处/坏处是什么?什么是最好的方式去?

CSV文件基本上只包含标题和几千行数据(最多约15列/字段)。所以没什么特别的。

回答

5

我可能会去一个自定义操作的结果(在我的例子实际系列化与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); 
} 
+0

看起来是一种很好的方法。我会给它一个去看看它是如何结束的。谢谢! :) – MrW 2010-07-23 10:08:27