MVC Ajax到api获得null模型

问题描述 投票:0回答:2

我在下班后感到困惑,因为我有一个关于在我的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控制器的模型完全是空的!

任何人都有任何想法?谢谢

jquery ajax asp.net-mvc api
2个回答
0
投票

在进行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对象,假设FirstNameLastName是可设置的属性

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;
        }
    }
}

0
投票

Tru将FromBody属性添加到PatientBindingModel参数中

[HttpPost]
public string AddPatient([FromBody] PatientBindingModel model)
{
    ...
}

在客户端尝试使用JSON.stringifyand指定contentTypedataType

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
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.