【发布时间】:2020-01-01 00:52:15
【问题描述】:
我正在从 ASP.NET 控制器操作返回 BadRequest(ModelState),如下所示:
public class Person{
[MaxLength(40)]
public string Name{get;set;}
public double Height{get;set;}
}
public Put([FromBody]Person item){
if(!ModelState.IsValid) return BadRequest(ModelState);
//save to db
return Ok(item);
}
这可行,但是当 BadRequest 被序列化为 JSON 时,大小写似乎不一致。首先,对象序列化为 camelCase,正如预期的那样:
GET /api
{ name:'foo',
height: 11
}
如果错误是模型绑定失败,那么外壳是驼峰式的:
PUT /api {name:'bob',height:'foo'}
{
height:['Could not convert 'foo' to double']
}
如果错误是验证失败,则大小写为 PascalCased:
PUT /api {name:'morethan40characters', height:12}
{
Name:['Name should be between 0 and 40 characters']
}
我想我明白为什么这是:模型绑定是从发布的 JSON 格式开始的,而验证是直接针对 .NET 类进行的,即 PascalCased。
但是,API 使用者不会关心这种区别,而是希望大小写一致。尤其是在带有 Vue 或 Angular 之类的客户端 UI 中,让所有内容保持驼峰式或至少一致会更简洁:
http.put('/api',item).then(x=>{...},e=>{ this.error=e.response.data });
...
<ul>
<li v-for="message in error.height">{{message}}</li>
<li v-for="message in error.Height">{{message}}</li>
<!-- line above smells -->
</ul>
<input type="text" v-model="item.height">
显然我可以在客户端处理错误响应,但是是否有一个标志或一些中间件我可以在服务器端执行以使其保持一致。最好是一致的驼峰式?
【问题讨论】:
-
所以不管你喜欢恒定的驼峰输出吗? link to stackoverflow post 也许这个链接有帮助?
标签: asp.net-core bad-request modelstate