C# ASP.Net WebAPI Post方法显示空值

C# ASP.Net WebAPI Post方法显示空值,c#,javascript,asp.net-mvc-4,knockout.js,asp.net-web-api,C#,Javascript,Asp.net Mvc 4,Knockout.js,Asp.net Web Api,从昨天起我就对这个问题束手无策。我开始用ASP.NETWebAPI学习knockoutjs。在我将数据发布回API控制器之前,一切都很好。每次我将数据传递给控制器时,它都会为Person对象的每个字段显示空值 我尝试了所有方法,例如使用带有contentType:“application/json”或contentType:“application/json,utf-8…”的$.ajax,但对我来说没有任何效果。请给出一些解决方案,我将非常感谢你 以下是WebAPI Post方法的代码: //

从昨天起我就对这个问题束手无策。我开始用ASP.NETWebAPI学习knockoutjs。在我将数据发布回API控制器之前,一切都很好。每次我将数据传递给控制器时,它都会为Person对象的每个字段显示空值

我尝试了所有方法,例如使用带有contentType:“application/json”或contentType:“application/json,utf-8…”的$.ajax,但对我来说没有任何效果。请给出一些解决方案,我将非常感谢你

以下是WebAPI Post方法的代码:

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

public class Person
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public List<string> activities { get; set; }
    public string favoriteHobby { get; set; }
}
最后是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>


名字:

姓氏:

你最喜欢的食物: 加载数据 保存数据


您发送的数据不是JSON;只有属性
为空。为了使发布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) {
});

如果您想发布类似JSON的内容

{ "value" : {"firstName" : "Jane", "lastName" : "Doe" }  }
对于ApiController方法,您需要添加额外的“model”服务器端

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) { .. }
公共类价值模型
{
公共人物值{get;set;}
} 
公共阶层人士
{
公共字符串名{get;set;}
公共字符串lastName{get;set;}
公共列表活动{get;set;}
公共字符串收藏夹{get;set;}
}
公共httpresponsemessagepost([FromBody]ValueModel model){..}
或者,在JSON中删除
{“value”:..}
,只需将
var data_to_send=ko.toJSON(self)


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

您需要将内容类型设置为url编码吗?您是否尝试过将
var data\u发布到\u send=ko.toJSON(self)
这很有效。但是你能解释一下为什么它不能与“ko.toJSON({value:self})”一起使用吗?也把这个作为答案贴出来,这样我就可以接受了。没有解决问题我尝试了我们的两种解决方案,但都不起作用。显示的Person对象的空值相同。。
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) { .. }