我有一个ASP.NET MVC 4项目,它使用ko.mapping检索数据并将其注入我的客户端ViewModel,以便它可以绑定在knockoutJS中:
$(document).ready(function () {
// Get the data from the server-side
var koModel = new MessageModel( [JSON-string] );
// Inject server-side model into the client-side viewModel
var viewModel = new MessageViewModel(koModel);
// Bind knockout
ko.applyBindings(viewModel);
});
// model loaded from the server-side
var MessageModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
}
// client-side data-bound viewModel
var MessageViewModel = function(koModel) {
var self = this;
self.data = koModel;
// Submit form
self.sendMessage = function () {
$.ajax({
url: 'http://services.mysite.net/api/Messaging',
type: 'POST',
data: self.data
});
}
}
其中一个属性是字符串。 JSON正确地看起来像这样:
"MyProperty": null
但是,当我POST到WebAPI 2.0服务时,Request参数如下所示:
"MyProperty": "null"
当WebAPI收到它时,将该字符串反序列化为" null"而不是null。
[HttpPut]
async public Task<IHttpActionResult>
Put(int id, [FromBody]MessageModel model)
{
// model.MyProperty is now "null" instead of being a null value
答案 0 :(得分:2)
由于您正在使用JSON,因此应使用ko.mapping.fromJSON()
而不是ko.mapping.fromJS()
(请参阅documentation中的“使用JSON字符串”)。在你的ajax调用中,你应该使用相反的转换方法:ko.mapping.toJSON()
:
...
data: ko.mapping.toJSON(self);
...
看到这个简单的demo。我已经创建了一个简单的Web API项目来验证这一点,就像一个魅力。