我在下班后感到困惑,因为我有一个关于在我的api中获取null模型的问题与另一个项目相同,一切都还可以!
关于问题
使用Javascript:
var data = new FormData(),
firstName = $('#FirstName').val(),
lastName = $('#LastName').val();
data.append("FirstName", firstName);
data.append("LastName", lastName);
var ajaxRequest = $.ajax({
type: "POST",
url: "/api/CRUD/AddPatient",
contentType: "application/json",
processData: false,
data: data,
success: function (xhr, data) {
alert(data);
},
error: function (xhr, ajaxOptions, thrownError) {
//handle error
}
});
API
public string AddPatient(PatientBindingModel model)
{
try
{
PatientStore ps = new PatientStore();
string ticks = DateTime.Now.Ticks.ToString();
ps.Register(model);
return "success";
}
catch (Exception ex)
{
string exMessage = ex.Message;
return exMessage;
}
}
传递给api控制器的模型完全是空的!
任何人都有任何想法?谢谢
在进行ajax调用时,如果要将contentType指定为“application / json”,则您的数据属性值应该是js对象的JSON字符串化版本。
这应该工作。
var d = { FirstName: "Ross", LastName: "Geller" };
$.ajax({
type: "POST",
url: "/api/CRUD/AddPatient",
contentType: "application/json",
data: JSON.stringify(d)
}).done(function(data) {
console.log(data);
}).fail(function(xhr, ajaxOptions, thrownError) {
alert(thrownError);
});
$.ajax
方法将使用application/json
发送请求作为请求Content-Type
标头。模型绑定器将读取此请求标头,并根据读取您发送的数据的值(来自请求正文或请求表单数据等)
如果要发送简单的平坦视图模型对象,则可以跳过显式指定contentType标头并仅将js对象作为数据发送。
var d = { FirstName: "Ross", LastName: "Geller" };
$.ajax({
type: "POST",
url: "/api/CRUD/AddPatient",
data: d
}).done(function (data) {
console.log(data);
}).fail(function (xhr, ajaxOptions, thrownError) {
alert(thrownError);
});
在这种情况下,$.ajax
方法将使用application/x-www-form-urlencoded
作为请求Content-Type
头发送请求。
现在模型绑定器将能够将发布的数据映射到方法参数对象PatientBindingModel
对象,假设FirstName
和LastName
是可设置的属性
public class PatientBindingModel
{
public string FirstName { set; get; }
public string LastName { set; get; }
}
此外,通常您的web api控制器中只有一个HttpPost
方法,您无需在请求URL中指定方法名称。您可以简单地执行类似/api/Customer
(更多REST样式资源URL)的操作,当您对该URL进行HttpPost类型调用时,框架会将该调用指向您使用[HttpPost]
属性标记的相应方法
public class CustomerController : ApiController
{
[HttpPost]
public string AddPatient(PatientBindingModel model)
{
try
{
return "success : "+model.FirstName;
}
catch (Exception ex)
{
string exMessage = ex.Message;
return exMessage;
}
}
}
Tru将FromBody
属性添加到PatientBindingModel
参数中
[HttpPost]
public string AddPatient([FromBody] PatientBindingModel model)
{
...
}
在客户端尝试使用JSON.stringify
and指定contentType
和dataType
:
var ajaxRequest = $.ajax({
type: "POST",
url: "/api/CRUD/AddPatient",
contentType: "application/json",
processData: false,
data: JSON.stringify(data),
contentType: 'application/json; charset=utf-8',
dataType: 'json'
success: function (xhr, data) {
alert(data);
},
error: function (xhr, ajaxOptions, thrownError) {
//handle error
}
});