在我们回答之前,您应该首先了解驼峰式 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 不会受到我的答案第一部分中使用的默认配置的影响