首页 > 解决方案 > 使用 $select 或 $filter 时 OData 默认为帕斯卡大小写

问题描述

在我的 .net core 3.1 web api 项目中,我使用Microsoft.AspnetCore.OdataMicrosoft.AspnetCore.Mvc.NewtonsoftJson. 我的启动看起来像这样:

    services.AddOData();
            services.AddControllers(options =>
            {
                IEnumerable<ODataOutputFormatter> outputFormatters =
                    options.OutputFormatters.OfType<ODataOutputFormatter>()
                        .Where(foramtter => foramtter.SupportedMediaTypes.Count == 0);

                foreach (var outputFormatter in outputFormatters)
                {
                    outputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/odata"));
                }

            }).AddNewtonsoftJson(options =>
            {
                options.UseCamelCasing(false);
                options.SerializerSettings.ContractResolver = new DefaultContractResolver() { NamingStrategy = new CamelCaseNamingStrategy() };
            });
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
app.UseEndpoints(endpoints =>
            {
                endpoints.MapHealthChecks("/health");
                endpoints.MapControllers().RequireAuthorization();
                endpoints.EnableDependencyInjection();
                endpoints.Select().OrderBy().Filter();
                endpoints.MapODataRoute("odata", "odata", GetEdmModel());
            });
}

IEdmModel GetEdmModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EnableLowerCamelCase();
            builder.EntitySet<Ebp>("Ebp");
            return builder.GetEdmModel();
        }

当我使用 调用GET端点{{baseUrl}}/odata/coaching/ebp/all时,结果camelCase如我所料。

在此处输入图像描述

但是,当我引入任何$select$filter选项进行查询时,我的响应更改为PascalCase

在此处输入图像描述

为什么会这样?

标签: asp.net-corejson.netodataasp.net-core-webapi

解决方案


答案就在这篇文章中。在AddNewtonSoftJson附加到服务集合的方法中,我应该SerializerSettings.ContractResolverCamelCasePropertyNamesContractResolver.

services.AddOData();
        services.AddControllers(options =>
        {
            IEnumerable<ODataOutputFormatter> outputFormatters =
                options.OutputFormatters.OfType<ODataOutputFormatter>()
                    .Where(foramtter => foramtter.SupportedMediaTypes.Count == 0);

            foreach (var outputFormatter in outputFormatters)
            {
                outputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/odata"));
            }

        }).AddNewtonsoftJson(options =>
        {
            options.UseCamelCasing(false);
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        });

推荐阅读