using CsvHelper.Configuration;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
public class Startup
{
//...
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddMvc().AddMvcOptions(options =>
{
options.OutputFormatters.Add(new CsvOutputFormatter());
});
}
//...
}
public class CsvOutputFormatter : TextOutputFormatter
{
private readonly CsvConfiguration _csvConfiguration;
public CsvOutputFormatter()
{
SupportedMediaTypes.Add("text/csv");
SupportedEncodings.Add(Encoding.UTF8);
_csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ",",
HasHeaderRecord = true
};
}
protected override bool CanWriteType(Type type)
{
if (typeof(IEnumerable).IsAssignableFrom(type) && type != typeof(string))
{
return true;
}
return base.CanWriteType(type);
}
public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
var response = context.HttpContext.Response;
using (var writer = new StreamWriter(response.Body))
{
using (var csv = new CsvWriter(writer, _csvConfiguration))
{
var model = context.Object;
var modelType = model.GetType();
if (typeof(IEnumerable).IsAssignableFrom(modelType))
{
csv.WriteRecords((IEnumerable
最后通过调用相应的控制器操作来调用CsvOutputFormatter并将CSV转换输出到客户端:
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.IO;
using System.Linq;
public class HomeController : Controller
{
//...
public IActionResult Csv()
{