gpt4 book ai didi

c# - CamelCasePropertyNamesContractResolver 在 MapHttpRoute 之后不工作

转载 作者:行者123 更新时间:2023-11-30 18:16:31 25 4
gpt4 key购买 nike

我正在尝试在我的 .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 行并在 Controller 中使用 Route 属性时,驼峰式外壳工作正常。

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

最佳答案

在我们回答之前,您应该首先了解驼峰式 API 响应覆盖不会影响模型验证(我们将在回答结束时解决这个问题)。

针对您的问题:

您必须使用相同的 HttpConfiguration 变量,因此请尝试改用它

// 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();

对于模型验证:

您必须创建一个所有其他 Controller 都应继承的基本 Controller ,然后通过创建一个您必须改用的新方法来覆盖 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;
}
}

此方法将编辑模型状态字典字符串键以符合 Camel 约定

现在在您的操作中,您可以使用此方法代替默认的 ModelState

......

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

......

1- 我检查了许多与解决 modelState 中的驼峰式大小写问题相关的答案,即使在 .net 核心中也是如此,但没有提供默认配置解决方案。正如他们提到的,modelState 不会受到我回答第一部分中使用的默认配置的影响

关于c# - CamelCasePropertyNamesContractResolver 在 MapHttpRoute 之后不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46401962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com