1

I'm trying to add a link to a basic MvcScaffolding project that outputs all data from a IQueryable interface. The controllers are built with Scaffold Controller Sales -Repository and have nothing out of the ordinary in the Sale class, just a few strings and some integers. Everything in the project works as expected.

From posts I've found, LINQtoCSV could be a possible solution for me (http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library). Unfortunately, I don't know what to add. If I have a link on the index page of /Sales/ that points to /Sales/CSV/, how can prompt the user with "Download or Open"?

I also saw this page (http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters) that tells how to build a Web API, but I cannot use MVC 4 per company standards.

The code I currently have in SalesController.cs is the following (which errors with [DirectoryNotFoundException: Could not find a part of the path 'C:\...\Sales\CSV\LINQtoCSV.CsvContext'.]):

    //
    // GET: /Sales/CSV/
    [Authorize]
    public FilePathResult CSV()
    {
        List<Sale> dataRows = saleRepository.All.ToList();

        CsvFileDescription outputFileDescription = new CsvFileDescription
        {
            SeparatorChar = '\t', // tab delimited
            //EnforceCsvColumnAttribute = false,
            FirstLineHasColumnNames = true, // no column names in first record
            FileCultureName = "en-US" // default is the current culture
        };
        CsvContext cc = new CsvContext();

        cc.Write<Sale>(dataRows,
            "output.csv",
            outputFileDescription);

        return File(cc.ToString(), "text/csv");
    }

EDIT: Modified code to create list from repository and output using File().

EDIT: This is the modified code that I'm using. In the model, I'm building the string with a joined list. The controller code is as follows:

    [Authorize]
    public FileStreamResult CSV3()
    {
        MemoryStream output = new MemoryStream();
        StreamWriter writer = new StreamWriter(output);
        saleRepository.All.ToList().ForEach(s => writer.WriteLine(s.ToStringCSV));

        writer.Flush();
        output.Position = 0;

        return File(output, "text/csv", "report.csv");
    }
tereško
  • 58,060
  • 25
  • 98
  • 150
tommy_o
  • 3,640
  • 3
  • 29
  • 33

1 Answers1

0

Maybe you need to use the FileResult class? See also How to create file and return it via FileResult in ASP.NET MVC?

Community
  • 1
  • 1
Nate
  • 30,286
  • 23
  • 113
  • 184