2014-05-14 42 views
0

从昨天开始,我就陷入了这个问题。我开始使用ASP.Net WebAPI学习knockoutjs。一切工作都很好,直到我将数据发回到API控制器。每次我将数据分配给控制器时,它都会显示Person对象的每个字段的空值。ASP.Net WebAPI Post方法显示空值

enter image description here

我什么都试过例如使用$ .ajax和contentType:'application/json',或contentType:'application/json,utf-8 ...',但对我来说没有任何作用。请给一些解决方案,我会非常感谢你..

这里是的WebAPI POST方法的代码:

// POST api/some 
public HttpResponseMessage Post([FromBody]Person value) 
{ 
    repository.SavePerson(value); 
    return Request.CreateResponse(HttpStatusCode.OK); 
} 

这里是Person类

public class Person 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public List<string> activities { get; set; } 
    public string favoriteHobby { get; set; } 
} 

而这里的JavaScript /淘汰赛代码

function PersonViewModel() { 
    var self = this; 

    self.firstName = ko.observable(''); 
    self.lastName = ko.observable(''); 
    self.activities = ko.observableArray([]); 
    self.favoriteHobby = ko.observable(''); 

    self.loadUserData = function() { 
     $.getJSON("api/Some/Get", function (data) { 
      self.firstName(data.firstName); 
      self.lastName(data.lastName); 
      self.activities(data.activities); 
      self.favoriteHobby(data.favoriteHobby); 
     }); 
    } 

    self.saveUserData = function() { 
     var data_to_send = { value: ko.toJSON(self) }; 
     $.post("api/Some/Post", data_to_send, function (data) { 
     }); 
    } 
}; 

ko.applyBindings(new PersonViewModel()); 

最后这里是HTML

<form action="#" method="post"> 
<p> 
    First name: 
    <input data-bind='value: firstName' /> 
</p> 
<p> 
    Last name: 
    <input data-bind='value: lastName' /> 
</p> 
<div> 
    Your favorite food: 
    <select data-bind='options: activities, value: favoriteHobby'> 
    </select> 
</div> 
<p> 
    <button data-bind='click: loadUserData'>Load Data</button> 
    <button data-bind='click: saveUserData'>Save Data</button> 
</p> 
</form> 
+0

你需要设置内容类型为url编码吗? – qamar

+1

您是否尝试过发布'var data_to_send = ko.toJSON(self)' –

+0

This Worked。但是你能解释为什么它不适用'ko.toJSON({value:self})'吗?还张贴这个答案,所以我可以接受它。 – Hammad

回答

2

如果你要像

{ "value" : {"firstName" : "Jane", "lastName" : "Doe" } } 

张贴JSON一个ApiController方法,你需要添加一个额外的“模式”服务器端

public class ValueModel 
{ 
    public Person value { get; set; } 
} 

public class Person 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
    public List<string> activities { get; set; } 
    public string favoriteHobby { get; set; } 
} 

public HttpResponseMessage Post([FromBody]ValueModel model) { .. } 

另外,降{"value": ..}你JSON和刚刚发布var data_to_send = ko.toJSON(self)

这是因为模型绑定绑定您发布JSON完全相同的“结构”。

0

您要发送的数据不是JSON;只有财产value是。为了得到张贴JSON的工作,你应该序列完整的对象,以JSON和设置内容类型:

var data_to_send = ko.toJSON({ value: self }); 
$.ajax({ 
    url: "api/Some/Post", 
    type: 'POST', 
    data: data_to_send , 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    async: false, 
    success: function(data) { 

    } 
}); 

但你也应该能够发布表单数据,而不是JSON的:

var data_to_send = { value: ko.toJS(self) }; 
$.post("api/Some/Post", data_to_send, function (data) { 
}); 
+0

没有解决问题,我尝试了我们的两个解决方案,但他们没有工作。显示Person对象的相同空值。 – Hammad