CamelCasePropertyNamesContractResolver在MapHttpRoute之后无法正常工作

我正在尝试在我的.Net API项目中实现JSON驼峰套管。 在我的启动课程中,我添加以下几行:

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

据我了解,这是在所有路线上实施骆驼套管所需的。 但是,当我添加以下内容时,无法正常工作,响应将以Pascal Case的forms返回:

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

当我删除上面的MapHttpRoute行并在控制器中使用Route属性时,驼峰套管工作正常。

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

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

对于你的问题:

您必须使用相同的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(); 

对于模型validation:

您必须创建一个所有其他控制器应inheritance的基本控制器,然后通过创建一个必须使用的新方法(ModelState是只读属性)来覆盖ModelStateDictionary,如下所示(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 camelKeys = new List(); 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-我已经检查了许多相关的解决方案,即使在.net核心中解决了modelState中的camelCase问题,但是非提供了默认的配置解决方案。 正如他们提到的那样,modelState不会受到我的答案第一部分中使用的默认配置的影响