【发布时间】:2015-10-25 05:18:52
【问题描述】:
我发布了一个非常简单的 JSON 对象。 WebApi 端点成功命中,但我传递的 JSON 数据似乎没有映射到我的 Dto 对象,我总是得到空值。这在以前的 MVC 版本中可以正常工作。我已经尝试了几件事,甚至添加了 [FromBody],正如在类似帖子中所建议的那样。知道为什么这不起作用吗?谢谢
角度服务:
app.service('Issue', [ '$resource',
function($resource) {
return $resource('api/issue', {}, {
save : { method: 'POST', url: 'api/issue/save' }
});
}]);
角度调用:
Issue.save({ id: 1, test: "test_string" });
Issue.save({ Id: 1, Test: "test_string" }); //this call works if I remove the camel case settings from the startup
Dto 对象:
public class IssueMinDto {
public int Id { get; set; }
public string Test { get; set; }
}
WebAPI 方法:
[HttpPost("save")]
public void SaveIssue([FromBody]IssueMinDto issue) { //issue is null here
//process data
}
稍后编辑:如果我从启动中删除驼峰式设置(下面的设置)并且我在调用中使用大写首字母,那么它可以工作,但这是不可接受的,因为我的所有数据整个应用程序都基于该初始设置(小写首字母)。在我当前的设置中,我有什么可以改进的地方吗?
启动设置 - 应该在这里解决问题:
services.AddMvc().Configure<MvcOptions>(options => {
options.InputFormatters.Clear();
var jsonOutputFormatter = new JsonOutputFormatter();
jsonOutputFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
options.OutputFormatters.Insert(0, jsonOutputFormatter);
});
稍后编辑
原来我的启动设置中的以下代码行导致了这个问题:
options.InputFormatters.Clear();
我用以下行替换了设置,现在一切正常:
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
【问题讨论】:
-
你能看到发送到服务器的请求吗?是否设置了正确的参数?
-
不应该是
Id和Test才能正确绑定吗? (或者,public int id、public int test) -
我也尝试过使用大写的首字母,但没有成功。此外,这在以前的 MVC 版本上运行良好。
-
@lrb: 我用 fiddler 来检查,在 composer 中拖动请求时,我可以在请求正文中看到 {"Id":1,"Test":"test_string"}
标签: angularjs asp.net-core asp.net-core-mvc