WebAPI将敲除映射空字符串反序列化为" null"

时间:2014-08-21 20:08:50

标签: asp.net-mvc serialization knockout.js asp.net-web-api knockout-mapping-plugin

我有一个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

1 个答案:

答案 0 :(得分:2)

由于您正在使用JSON,因此应使用ko.mapping.fromJSON()而不是ko.mapping.fromJS()(请参阅documentation中的“使用JSON字符串”)。在你的ajax调用中,你应该使用相反的转换方法:ko.mapping.toJSON()

...
data: ko.mapping.toJSON(self);
...

看到这个简单的demo。我已经创建了一个简单的Web API项目来验证这一点,就像一个魅力。