前言

之前就有写过一篇 <<前后端沟通 naming conversion 转换需要知道的事>>

这篇做一个总结整理.

我们知道 C# 的 Property 是 PascalCase, 而 Javascript 是 camelCase. 2 者要沟通就需要转换.

简单的理解就是把 PascalCase 的第一字变成小写. 就变成了 camelCase. 在大部分的情况下这个是对的. 直到遇上缩写.

比如: DLPDate, FSBCert, CADDesigner (没办法, 不可能强制世界没有缩写)

如果只是把第一个字变成小写就成了 dLPDate, fSBCert, cADDesigner

而比较正确的是 dlpDate, fsbCert, cadDesigner. 所以当有用到缩写时, 都需要额外注意哦.

涉及范围

System.Text.Json

Web API post data 和 response data 的时候. PascalCase 和 camelCase 转换

OData

Web API response data 的时候, PascalCase to camelCase

Swagger

估计它就是基于 System.Text.Json 和 OData 的

FluentValidation

Response error 的时候 property name 和 display name. PascalCase to camelCase and Title Case.

Web API Problem Details

Web API response error message 的时候, PascalCase to camelCase (类似 fluent validation 只不过是用 ASP.NET Core build-in 的 annotation)

默认行为 & Override

System.Text.Json

FirstName -> firstName

CADDesigner -> cadDesigner (哎哟, 它不是简单的把第一字变小写而已哦)

CADDesignerCADDesigner -> cadDesignerCADDesigner (哎哟, 第 2 个 CAD 就没有处理了)

它是什么机制呢 ? 看源码

第 52 行负责把字变小.

第 33 行判断如果第 2 个字是小写, 那么直接中断. 也就等于单纯的把第一个字变小, 后续就不管了. (所以 FirstNAME -> firstNAME, 后面的 NAME 是不管的了)

如果第 2 个字不是小写, 而是连续的大写. 那么就不会中断, 会一直连续变小.

直到第 41 行, 下一个字是小写. (所以...一开始连续大写, 一直变小, 直到第一个小写出现)

比如 CADDesigner  一直到下一个小写就是 Designer 的 D 位置, 中断.

中断前还有一个判断, 第 44 行, 下一个小写的字母是不是一个空格. 如果不是的话, 那么当前这个字保留大写

比如 CADDesigner 到 index 3 "D" 最终是 cadDesigner, D 保留了大写.

如果是 CAD Designer 那么到 index 2 "D" 下一个是空格, 然后它变小, 然后中断, 就成了 cad Designer

从这里可以知道, 它虽然有处理缩写, 但只是处理开头几个字的缩写而已. 所以还是要多留意哦.

如果遇到它转换不对, 可以使用 JsonPropertyName 来解决.

OData & Swagger

OData 虽然没有用 System.Text.Json, 但效果是一样的,

builder.EnableLowerCamelCase()

在 builder 声明要 camelCase.

然后在 ModelCreating 的时候就会把 property 变小写

和 System.Text.Json 差不多, 都是有顾虑的开头连续大写的情况

另外说一下, OData 不支持 JsonPropertyName, 如果要换 PropertyName 可以用传统的 [DataContract] (不推荐, 因为要写全套, 每一个 Property 都要写 Attribute)

另一个方法是在 builder 的时候 EntitySetConfig.Property(e => e.Name).Name = "NewName"

这个是换 PropertyName, 并不是换 Case Style 哦. 如果是想要特别的 case style convert 就要自己实现一个 builder.EnableLowerCamelCase(), follow 上面源码就知道怎么弄了.

FluentValidation

FluentValidation 返回 Error Property 默认是 PascalCase 的.

Issue: Add option to camelCase property names

解决方式是写一个 Resolver

里面是这样的

拿到相关的 information 后, 就可以返回想要的逻辑了.

另外一个要注意的点是, 一旦改了 property name, 整个作用域的 property 就换掉了哦, 比如在 Must 里, 本来可以通过 PropertyName 去做些反射, 就变得不可以了 (也不是很糟糕啦, 最多就是外面传进来咯)

还有一点是 DisplayName 是通过 PropertyName 生成的, 所以如果你换了 PropertyName, DisplayName 也会改变.

ClassPropertyName -> FluentPropertyName -> FluentDisplayName

如果也提供了 DisplayNameResolver 就变成

ClassPropertyName -> FluentDisplayName 了.

Web API Problem Details

顺便吐槽一下 ASP.NET Core 生态.

ModelState json serialization should be camel cased 2019 年, 有人提了 issue

被无知的人快速的关掉了.

大家就在一个 closed issue 继续说来说去.

一直到 bot 关掉,没人能继续说后. 才开了新的 issue

Reopen 7439 - ModelState json serialization should be camel cased

又过了一年后, 大部分无知的人终于意识到这根本是一个 bug. 哪有人会设计成那样 (除了无知的人)

于是终于有了最新的 issue

New ProblemDetails Json formatting configuration

有时候很感叹, ASP.NET Core 和 Angular 的 issue 总是能看到这种几年都 fix 不了的 common issue. 只能说要标榜是一个 Framework 还任重道远呢.

更新:2024-08-08

这个 issue 在 2022-04-09 被 resolved 了,添加以下这行代码就可以了。

builder.Services.AddControllers(options =>
{
options.ModelMetadataDetailsProviders.Add(new SystemTextJsonValidationMetadataProvider());
});

总结

1. FluentValidation 必须实现一个 camelCase property name resolver

2. 如果没有缩写, 什么也不必烦.

3. 如果只是前面缩写, 那么也不必烦.

4. 如果缩写翻车, 建议是闪, 如果真的闪不掉. 用 JsonPropertyName, OData 就写一个一个 builder conversion.

ASP.NET Core – Case Style Conversion的更多相关文章

  1. ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL

    ASP.NET CORE MVC 中,默认的 Route 模板是: /{controller}/{action}  .我们可以通过开启 URL 小写转换将 URL 变为小写,但此方式在 Control ...

  2. [asp.net core] Tag Helpers 简介(转)

    原文地址 https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro What are Tag Helpers? ...

  3. Working with Data » 使用Visual Studio开发ASP.NET Core MVC and Entity Framework Core初学者教程

    原文地址:https://docs.asp.net/en/latest/data/ef-mvc/intro.html The Contoso University sample web applica ...

  4. Professional C# 6 and .NET Core 1.0 - 40 ASP.NET Core

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 40 ASP.NET Core --- ...

  5. 用VSCode开发一个asp.net core2.0+angular5项目(5): Angular5+asp.net core 2.0 web api文件上传

    第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.html 第三 ...

  6. ASP.NET Core Building chat room using WebSocket

    Creating “Login form” We use here simple form where user can insert his or her preferred nick name f ...

  7. [转]Build beautiful, responsive sites with Bootstrap and ASP.NET Core

    本文转自:https://docs.microsoft.com/en-us/aspnet/core/client-side/bootstrap?view=aspnetcore-2.1 Bootstra ...

  8. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  9. 升级 asp.net core 1.1 到 2.0 preview

    Upgrading to .NET Core 2.0 Preview 1 更新 依赖的类库 改为 标准库 2 web app  更改 csproj 文件---升级版本 <PropertyGrou ...

  10. ASP.NET CORE RAZOR :将文件上传至 ASP.NET Core 中的 Razor 页面

    本部分演示使用 Razor 页面上传文件. 本教程中的 Razor 页面 Movie 示例应用使用简单的模型绑定上传文件,非常适合上传小型文件. 有关流式传输大文件的信息,请参阅通过流式传输上传大文件 ...

随机推荐

  1. thinkphp5 关于跨域的一些坑

    1.首先在tp5的入口文件:public/index.php 在里面添加三行: // [ 应用入口文件 ] header("Access-Control-Allow-Origin:*&quo ...

  2. [oeasy]python0019_ 打包和解包_struct_pack_unpack

    ​ 打包和解包 回忆上次内容 ASCII 由这样几类字符构成 英文大写字符 英文小写字符 数字 符号 电报时代对于英文.数字的编码 使用的是摩斯电码 ​ 编辑 这摩斯电码是3进制的编码方式 长短空 怎 ...

  3. oeasy教您玩转python - 002 - # 你好世界 - 各位同学除夕快乐,除旧布新之时预祝能玩

    ​ 你好世界 回忆上次内容 了解了 Python 安装了 Python 进入了 Python 退出了 Python 可是我们什么也没有做就离开了 IDLE 游乐场! 你好世界 #首先进入Python3 ...

  4. Swift开发基础08-高阶函数

    高阶函数是指接受其它函数作为参数,或者返回其它函数的函数.Swift 提供了许多内置的高阶函数,这些函数在处理集合类型数据(如数组.集合等)时尤其有用.常见的高阶函数包括 map.filter.red ...

  5. ASP.NET MVC / WebAPI 路由机制详解

    从MVC到WebApi,路由机制一直都在其中扮演着重要的角色. 它可以很简单:如果你只需要会用一些简单的路由,如/Home/Index那么你只需要配置一个默认路由就能搞定. 它可以很神秘:你的url可 ...

  6. MySQL 实现 EF Code First TimeStamp/RowVersion 并发控制

    在将项目迁移到MySQL 5.6.10数据库上时,遇到和迁移到PostgreSQL数据库相同的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Serv ...

  7. Visual Studio中如何解决error C4996: 问题

    error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To di ...

  8. 如何让 MGR 不从 Primary 节点克隆数据?

    问题 MGR 中,新节点在加入时,为了与组内其它节点的数据保持一致,它会首先经历一个分布式恢复阶段.在这个阶段,新节点会随机选择组内一个节点(Donor)来同步差异数据. 在 MySQL 8.0.17 ...

  9. OI生涯回忆&退役之后

    一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程 --<庄子·秋水> 好吧,现在是2024年7月24日,我现在正坐在某编程机构的办公室电脑旁,写下这些文字,是啊,我已经退役将近两 ...

  10. scratch源码下载 | 炮轰僵尸

    程序说明: <炮轰僵尸>是一款基于Scratch平台制作的游戏程序,它采用了植物大战僵尸的经典场景.在游戏中,玩家需要控制一枚大炮来对抗不断入侵的僵尸.通过移动鼠标,玩家可以调整炮筒的方向 ...