I am working on an asp.net mvc web application and i have the folloiwng view:-
@model MvcApplication4.Models.SelectedCustomers
<h3>Select Customers Detials</h3>
@using (Html.BeginForm("Export", null))
{    <table>
        <tr>
            <th>
                NAME @Html.CheckBox("IncludeName", true)
            </th>
            <th>
                Description @Html.CheckBox("IncludeDescription", true)
            </th>
            <th>
                Address @Html.CheckBox("IncludeAddress", true)
            </th>
        </tr>
        @foreach (var item in Model.Info) {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.ORG_NAME)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.LOGIN_URI)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.SUPPORT_EMAIL)
                </td>
                @Html.HiddenFor(modelItem => item.ORG_ID)
            </tr>
        }
    </table>
    <p>
        @Html.ActionLink("Back","customer","Home") |
        <button type="submit" name="Format" value="xls">extract to excel</button> |
        <button type="submit" name="Format" value="csv">extract to text file</button>
    </p>
}
and the folloiwng action methods:-
[HttpPost]
        public ActionResult Export(ExportViewModel exportOptions, IList<AccountDefinition> accounts)
        {
          // var accounts = GetAccount();
            if (exportOptions.Format == "csv")
            {
                return accounts.AsCsvResult(exportOptions);
            }
            else if (exportOptions.Format == "xls")
            {
                return accounts.AsXlsResult(exportOptions);
            }
            throw new NotSupportedException(
                string.Format("Unsupported format: {0}", exportOptions.Format)
            );
        }
Then i defined the folloiwng method inside my AccountDefinition model:-
 public partial class AccountDefinition
    {
        public long ORG_ID { get; set; }
        public string ORG_NAME { get; set; }
        public string LOGIN_URI { get; set; }
        public string SUPPORT_EMAIL { get; set; }
        public virtual SDOrganization SDOrganization { get; set; }
    }
    public static class ActionResultextensions
    {
        public static ActionResult AsCsvResult(this IEnumerable<AccountDefinition> accounts, ExportViewModel exportOptions)
        {
            return new CsvResult(accounts, exportOptions);
        }
        public static ActionResult AsXlsResult(this IEnumerable<AccountDefinition> accounts, ExportViewModel exportOptions)
        {
            return new XlsResult(accounts, exportOptions);
        }
    }
}
Then i have the folloiwng model classes:-
1.
public class CsvResult : ExportAccountsResult
    {
        public CsvResult(IEnumerable<AccountDefinition> accounts, ExportViewModel exportOptions)
            : base(accounts, exportOptions)
        {
        }
        protected override string ContentType
        {
            get { return "text/csv"; }
        }
        protected override string Filename
        {
            get { return "accounts.csv"; }
        }        }
2,
 public class XlsResult : ExportAccountsResult
    {
        public XlsResult(IEnumerable<AccountDefinition> accounts, ExportViewModel exportOptions)
            : base(accounts, exportOptions)
        {
        }
        protected override string ContentType
        {
            get { return "application/vnd.ms-excel"; }
        }
        protected override string Filename
        {
            get { return "accounts.csv"; }
        }
    }
3.
public class ExportViewModel
    {
        public string Format { get; set; }
        public bool IncludeName { get; set; }
        public bool IncludeDescription { get; set; }
        public bool IncludeAddress { get; set; }
    }
4.
public abstract class ExportAccountsResult : ActionResult
    {
        protected ExportAccountsResult(IEnumerable<AccountDefinition> accounts, ExportViewModel exportOptions)
        {
            this.Accounts = accounts;
            this.ExportOptions = exportOptions;
        }
        protected IEnumerable<AccountDefinition> Accounts { get; private set; }
        protected ExportViewModel ExportOptions { get; private set; }
        protected abstract string ContentType { get; }
        protected abstract string Filename { get; }
        public override void ExecuteResult(ControllerContext context)
        {
            var response = context.HttpContext.Response;
            response.ContentType = ContentType;
            var cd = new ContentDisposition
            {
                FileName = this.Filename,
                Inline = false
            };
            response.AddHeader("Content-Disposition", cd.ToString());
            // TODO: Use a real CSV parser here such as https://github.com/JoshClose/CsvHelper/wiki/Basics
            // and never roll your own parser as shown in this oversimplified
            // example. Here's why: http://secretgeek.net/csv_trouble.asp
            using (var writer = new StreamWriter(response.OutputStream))
            {
                foreach (var account in this.Accounts)
                {
                    var values = new List<object>();
                    if (this.ExportOptions.IncludeName)
                    {
                        values.Add(account.ORG_NAME);
                    }
                    if (this.ExportOptions.IncludeDescription)
                    {
                        values.Add(account.LOGIN_URI);
                    }
                    if (this.ExportOptions.IncludeAddress)
                    {
                        values.Add(account.SUPPORT_EMAIL);
                    }
                    writer.WriteLine(string.Join(", ", values));
                }
            }
        }
    }
But when i run click on "extract to excel" or "extractt to text file" button inside the view i got the following exception :-
System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=MvcApplication4
  StackTrace:
       at MvcApplication4.Models.ExportAccountsResult.ExecuteResult(ControllerContext context) in c:\Users\Administrator\Desktop\MvcApplication4\MvcApplication4\Models\ExportAccountsResult.cs:line 41
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
  InnerException:
on the following code inside the ExportAccountsresults.cs:-
 foreach (var account in this.Accounts)
                {
:::UPDATED:::
I have updated my view to the following:-
@model MvcApplication4.Models.SelectedCustomers
<h3>Select Customers Detials</h3>
    @using (Html.BeginForm("Export", null))
    {
        Int32 c = -1;
        <table>
            <tr>
                <th>
                    NAME @Html.CheckBox("IncludeName", true)
                </th>
                <th>
                    Description @Html.CheckBox("IncludeDescription", true)
                </th>
                <th>
                    Address @Html.CheckBox("IncludeAddress", true)
                </th>
            </tr>
            @foreach (var item in Model.Info) {
                c++;
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.ORG_NAME)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.LOGIN_URI)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.SUPPORT_EMAIL)
                    </td>
                     <td>@Html.Hidden(String.Format("Info[{0}].ORG_ID", c), item.ORG_ID)</td>
                </tr>
            }
        </table>
        <p>
            @Html.ActionLink("Back","customer","Home") |
            <button type="submit" name="Format" value="xls">extract to excel</button> |
            <button type="submit" name="Format" value="csv">extract to text file</button>
        </p>
    }
And my action method to the following:-
  [HttpPost]
        public ActionResult Export(ExportViewModel exportOptions, SelectedCustomers sc)
        {
          // var accounts = GetAccount();
           var accounts = sc.Info.ToList();
            if (exportOptions.Format == "csv")
            {
                return accounts.AsCsvResult(exportOptions);
            }
            else if (exportOptions.Format == "xls")
            {
                return accounts.AsXlsResult(exportOptions);
            }
            throw new NotSupportedException(
                string.Format("Unsupported format: {0}", exportOptions.Format)
            );
        }
Now the csv file will open but it will be empty and it will noly contain ", ," for each record, for exmaple if there should be 7 records in the excel sheet or text file then the .csv file will have the following without data:-
, , 
, , 
, , 
, , 
, , 
, , 
, , 
 
    