1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Reflection;
5: using System.Text;
6: using System.Web;
7: using System.Web.Mvc;
8:
9: namespace MvcApplication1
10: {
11: public class CsvResult<TModel, T> : ActionResult where TModel : IEnumerable<T>
12: {
13: public string FileName { get; set; }
14: public TModel Model { get; set; }
15:
16: public override void ExecuteResult(ControllerContext context)
17: {
18: StringBuilder csvBuilder = new StringBuilder();
19:
20: context.HttpContext.Response.Clear();
21:
22: context.HttpContext.Response.Buffer = true;
23: context.HttpContext.Response.ContentType = "text/csv";
24: context.HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + this.FileName);
25:
26: PropertyInfo[] modelProperties = typeof(T).GetProperties();
27: StringBuilder itemBuilder = new StringBuilder();
28:
29: // render header.
30: foreach (PropertyInfo modelProperty in modelProperties)
31: {
32: if (modelProperty.DeclaringType == typeof(T))
33: {
34: if (itemBuilder.Length == 0)
35: itemBuilder.Append(modelProperty.Name);
36: else
37: itemBuilder.Append(",").Append(modelProperty.Name);
38: }
39: }
40:
41: csvBuilder.Append(itemBuilder);
42:
43: // render body.
44: foreach (T item in this.Model)
45: {
46: csvBuilder.Append(Environment.NewLine);
47: itemBuilder.Clear();
48:
49: foreach (PropertyInfo modelProperty in modelProperties)
50: {
51: if (modelProperty.DeclaringType == typeof(T))
52: {
53: if (itemBuilder.Length == 0)
54: itemBuilder.Append(modelProperty.GetValue(item, null).ToString());
55: else
56: itemBuilder.Append(",").Append(modelProperty.GetValue(item, null).ToString());
57: }
58: }
59:
60: csvBuilder.Append(itemBuilder);
61: }
62:
63: context.HttpContext.Response.Write(csvBuilder.ToString());
64: }
65: }
66: }