CamelCasePropertyNamesContractResolver 在 MapHttpRoute 之后不工作

2024-01-06

我正在尝试在我的 .Net API 项目中实现 JSON 驼峰式大小写。在我的启动类中,我添加了以下几行:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
    new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;

据我了解,这是在所有路线上实施驼峰式外壳所需的。但是,当我添加以下内容时,这不起作用,响应以 Pascal Case 形式返回:

RouteTable.Routes.MapHttpRoute(
    "DefaultApi",
     "{controller}/{id}",
      new {id = RouteParameter.Optional}
);

当我删除上面的 MapHttpRoute 行并在控制器中使用 Route 属性而不是驼峰外壳时,效果很好。

有谁知道这里发生了什么吗?


在我们回答之前,您应该首先了解驼峰式 API 响应重写不会影响模型验证(我们将在答案的最后解决这个问题)。

对于您的问题:

你必须使用相同的Http配置变量,所以尝试使用它

// config is an HttpConfiguration object

config.Routes.MapHttpRoute(
     name: "API Default",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = RouteParameter.Optional });

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

对于模型验证:

您必须创建一个所有其他控制器都应继承的基本控制器,然后通过创建一个您必须使用的新方法来覆盖 ModelStateDictionary(ModelState 是只读属性),如下 (1):

public class BaseApiController : ApiController
{
    public ModelStateDictionary ModelStateAsCamelCase()
    {
        var newModelStateDictionary = new ModelStateDictionary();

        foreach (var element in ModelState)
        {
            if (!string.IsNullOrWhiteSpace(element.Key))
            {
                var keys = element.Key.Split('.');
                List<string> camelKeys = new List<string>();
                foreach (var key in keys)
                {
                    camelKeys.Add(key.First().ToString().ToLowerInvariant() + key.Substring(1));
                }

                // You can (add a / change this) code if the returned key is not
                // composed from the ObjectName.Property, such as when it is 
                // composed from the property name

                var newKey = camelKeys.Aggregate((i, j) => i + "." + j);

                newModelStateDictionary.Add(newKey, element.Value);
            }
            else
                newModelStateDictionary.Add(element);
        }
        return newModelStateDictionary;
    }
}

此方法将编辑模型状态字典字符串键以遵守驼峰约定

现在在您的操作中,您可以使用此方法而不是默认的 ModelState

......

if (!ModelState.IsValid)
    return BadRequest(ModelStateAsCamelCase());

......

1-我已经检查了许多与解决 modelState 中的驼峰命名问题相关的答案,即使是在 .net core 中,但没有提供默认的配置解决方案。正如他们提到的, modelState 不会受到我的答案第一部分中使用的默认配置的影响

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CamelCasePropertyNamesContractResolver 在 MapHttpRoute 之后不工作 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • 自动映射器多对多 stackoverflowException

    我遇到以下映射的堆栈溢出 Mapper CreateMap
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • .NET 5 EF Core SaveChangesAsync 因错误而挂起

    尽管这个问题有很多结果 但没有一个真正给我明确的答案 每次我尝试通过 AddAsync 和 SaveChangesAsync 方法插入错误数据 例如重复的主键 时 我都会看到以下日志 执行 DbCommand 失败 15 毫秒 我还在 SQ
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • 通过查询字符串传递“Bearer”时 SignalR 身份验证失败

    我想在 SignalR 中启用身份验证 而服务器托管在 ASP NET WebAPI 中 我使用 OAuth Bearer 身份验证 客户端是 AngularJS 在客户端 我最初通过 HTTP 标头传递 Bearer 令牌 它与 WebA
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类
  • 使用 CodeDOM 将程序集添加到 BuildManager 会导致间歇性错误

    我正在使用 CodeDOM 在运行时创建内存中程序集 如下所示 public Assembly Compile CodeCompileUnit targetUnit string path Path GetDirectoryName new

随机推荐

  • 合并单独几何图层的图例

    我正在地图上绘制来自两个单独图层的点数据 并希望在一个图例中显示两个图层的信息 下面是一些代码来说明问题 set seed 42 lat1 lt rnorm 10 54 12 long1 lt rnorm 10 44 12 val1 lt
  • iOS - UILabel 或 UITextView 中的动画文本大小变化?

    在显示文本块的应用程序中 当设备转向横向时 我的字体大小会增加 我不喜欢它如何执行整个动画 然后突然跳到新的尺寸 所以我想在旋转过程中为尺寸变化设置动画 我在某处读到 将这个更改放入UIView动画块不起作用 因为字体属性不可设置动画 那么
  • 谷歌分析数据库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道 Google Analytics 中的数据是如何组织的吗 很难从大量数据中进行选择 它们执行
  • Laravel Http Facade 中的 PHP Curl 代理选项

    我正在使用 Laravel 的 Http 外观来发出请求 例如 Http withHeaders user agent gt My User agent gt retry 3 500 gt get https example com gt
  • mysql_fetch_array 返回重复数据

    每次我运行 mysql fetch array 时都会返回一个带有重复值的数组e g Array 0 gt 1 row id gt 1 1 gt some text first field gt some text 2 gt some te
  • 将图例添加到 LineCollection 图中

    这是与中给出的答案相关的派生问题根据颜色图设置线条颜色 https stackoverflow com questions 19868548 set line colors according to colormap其中建议了一个很好的解决
  • ASP.NET MVC:路由层次结构 URL

    我该如何为此制定路由 URL 类别 主 子 or 类别 主 sub1 subsub 我希望有 主 子 and 主 子1 子子 作为 CategoryController 的 Index 操作方法中的参数 找到了答案 应在路由路径中使用 ca
  • 使用 Node 'pg' 库连接到 Amazon Redshift

    我尝试使用 pg 库将我的 API 连接到 Redshift 实例 但出现以下错误 Possibly unhandled error SET TIME ZONE is not supported at Connection parseE U
  • Http 304 和缓存控制:无缓存

    我看到对网络服务器的一些调用的以下响应 初始调用 HTTP 1 1 200 OK Date Mon 16 Jan 2012 05 46 49 GMT X Powered By Servlet 2 5 JSP 2 1 Content Type
  • 向 D3 和弦图添加标签

    我是一名菜鸟程序员 所以这对于你们大多数人来说可能是一个简单的任务 此和弦图的标签和 或鼠标悬停文本需要哪些代码行 http mbostock github com d3 ex chord html http mbostock github
  • 在 azure 搜索中索引字典属性

    我有一个具有 type 属性的 DTODictionary
  • TextInputLayout 错误状态下的提示颜色

    根据 Google 的材料指南 https material io guidelines components text fields html text fields layout https material io guidelines
  • 拖动列时显示列标题

    我在中实现代码可分组标题 http www java2s com Code Java Swing Components GroupableGroupHeaderExample htm并尝试启用允许的重新排序 但我有两个问题 1 拖动列时 标
  • 使用自定义插值内核的 MATLAB imresize

    如何使用我的函数作为 MATLAB 中 imresize 函数的插值方法 我阅读了MATLAB关于如何使用自定义函数进行插值方法的帮助 但没有任何明确的示例 我试着为妈妈写一段代码 The imresize命令将默认使用bicubic方法
  • 这个只有一个操作数的 x86-64 addq 指令是什么意思? (摘自CSAPP书籍第三版)

    在下面的说明中 addq 是如何工作的 它只有一个操作数 书上声称它递增 rdx 但 rdx 不在这条指令中 我感到很困惑 这是来自 计算机系统 程序员的视角 一书 第三版 正如 Jester 在评论中指出的那样 这确实是一个错误 我实际上
  • 如何在带引号的表达式中转义扩展路径名扩展模式?

    除了基本的 and 模式 Bash shell 提供了扩展的模式匹配运算符 例如 pattern list 匹配除给定模式之一之外的所有模式 这extglob需要设置 shell 选项才能使用它们 一个例子 mkdir test cd te
  • 根据项目特定情况设置函数默认值 R

    通常 我使用相同的功能设置 我想知道除了在路径中拥有一个本质上是函数包装器的新对象之外 是否还有一种方法来设置默认参数 例如 paste 有它的sep参数设置为空格 我写累了 sep 一遍又一遍 那么有没有办法 暂时 用我选择的默认值替换该
  • 如何从 SVN 的修订版本中删除 1 个文件?

    我的一位同事在 SVN 中签入了一些文件 其中一个文件中有密码 密码已从文件中删除 并签入了新版本 但如果我们查看修订历史记录并转到该修订版本 密码显然仍在存储库中 我们使用 TortoiseSVN 作为客户端 那么如何安全地从 SVN 存
  • Apple iTunes Connect Analytics:归因提供商和营销活动 ID 值传递给应用程序委托

    新的 iTunes Connect 现在具有分析功能 您可以在 URL 中指定提供商 pid ID 和活动 ID cid 例如 您可以将这些值传递到应用程序中以用于各种目的吗 即使经过检查 我也找不到任何表明这一点的内容 didFinish
  • CamelCasePropertyNamesContractResolver 在 MapHttpRoute 之后不工作

    我正在尝试在我的 Net API 项目中实现 JSON 驼峰式大小写 在我的启动类中 我添加了以下几行 config Formatters JsonFormatter SerializerSettings ContractResolver