我班级的一系列字符串属性不会出现在CSV中

发布于 2025-02-10 02:15:33 字数 2431 浏览 2 评论 0原文

我正在使用CSVHelper(VER:27.2.1)。 我有一个get api,我正在尝试启用文本/CSV接受标头。因此,当我以Accept Header为文本/CSV向Postman发出GET请求时,我会得到CSV响应。 因此,我创建了一个CSV输出格式化器,并在program.cs中添加到了我的outputforamtters集合中。

下面的代码工作正常,除了在我的响应CSV中,我没有得到角色标题或值。它被完全忽略了。

我尝试创建一个地图并将其与RegisterClassMap一起使用,但是当我这样做时,API本身就停止工作。我的意思是,一旦我

csvWriter.Context.RegisterClassMap<CSVMap>();

在WriteresponsebodyAsync方法中介绍。 API停止返回CSV结果。

我有一个具有多个属性的课程。

public class Employee {
 public string Name{get;set;}
 public string[] Roles {get;set;}
 public Employer company {get;set;}
}

public class Employer{
 public string EmpPloyerName {get;set;}
}

我的csvoutputformatter看起来像下面-----------&gt;

public class CsvOutputFormatter : TextOutputFormatter
    {
        public CsvOutputFormatter()
        {
            SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/csv"));
            SupportedEncodings.Add(Encoding.UTF8);
            SupportedEncodings.Add(Encoding.Unicode);
        }
        
        protected override bool CanWriteType(Type type)
        {
           
            if (typeof(IEnumerable).IsAssignableFrom(type))
            {
                return base.CanWriteType(type);
            }
            return false;
        }
       
        public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            var streamWriter = new StreamWriter(context.HttpContext.Response.Body, selectedEncoding, leaveOpen: true);

            await using (var csvWriter = new CsvWriter(streamWriter, new CsvConfiguration(System.Globalization.CultureInfo.InvariantCulture)))
            {
                //csvWriter.Context.RegisterClassMap<CSVMap>();
                await csvWriter.WriteRecordsAsync((IEnumerable)context.Object);
            }
        }
        


     public class CSVMap : ClassMap<Employee>
        {
            public CSVMap()
            {
                AutoMap(System.Globalization.CultureInfo.InvariantCulture);
                Map(m => m.Roles).Convert(row => string.Join(",", row.Value.Roles));
            }
        }

    

输出格式登记在program.cs ---&gt;

  builder.Services.AddControllers(
     options =>
  {
     options.RespectBrowserAcceptHeader = true;
     options.OutputFormatters.Add(new CsvOutputFormatter());

  });

I am using CsvHelper (ver: 27.2.1).
I have a Get API and i am trying to enable text/csv Accept header. So that when I initiate a Get Request from Postman with Accept header as text/csv, I get a CSV response.
So I created a CSV output formatter and added to my outputforamtters collection in Program.cs.

The piece of code below is working fine except that in my response csv i am not getting the Roles header or the value. It's completely ignored.

I tried creating a Map and use it with RegisterClassMap but when i do that the api itself stops working. I mean as soon as i introduce

csvWriter.Context.RegisterClassMap<CSVMap>();

in WriteResponseBodyAsync method. The api stops returning csv result.

I have a class with multiple properties.

public class Employee {
 public string Name{get;set;}
 public string[] Roles {get;set;}
 public Employer company {get;set;}
}

public class Employer{
 public string EmpPloyerName {get;set;}
}

My CsvOutputFormatter looks like below ---------->

public class CsvOutputFormatter : TextOutputFormatter
    {
        public CsvOutputFormatter()
        {
            SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/csv"));
            SupportedEncodings.Add(Encoding.UTF8);
            SupportedEncodings.Add(Encoding.Unicode);
        }
        
        protected override bool CanWriteType(Type type)
        {
           
            if (typeof(IEnumerable).IsAssignableFrom(type))
            {
                return base.CanWriteType(type);
            }
            return false;
        }
       
        public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            var streamWriter = new StreamWriter(context.HttpContext.Response.Body, selectedEncoding, leaveOpen: true);

            await using (var csvWriter = new CsvWriter(streamWriter, new CsvConfiguration(System.Globalization.CultureInfo.InvariantCulture)))
            {
                //csvWriter.Context.RegisterClassMap<CSVMap>();
                await csvWriter.WriteRecordsAsync((IEnumerable)context.Object);
            }
        }
        


     public class CSVMap : ClassMap<Employee>
        {
            public CSVMap()
            {
                AutoMap(System.Globalization.CultureInfo.InvariantCulture);
                Map(m => m.Roles).Convert(row => string.Join(",", row.Value.Roles));
            }
        }

    

Output Formatter registering in Program.cs--->

  builder.Services.AddControllers(
     options =>
  {
     options.RespectBrowserAcceptHeader = true;
     options.OutputFormatters.Add(new CsvOutputFormatter());

  });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文