小编典典

Web Api参数始终为null

ajax

当我使用下面的ajax调用下面的Post方法时,为什么参数总是为null?

public IEnumerable<string> Post([FromBody]string value)
{
    return new string[] { "value1", "value2", value };
}

这是通过ajax对Web API方法的调用:

  function SearchText() {
        $("#txtSearch").autocomplete({
            source: function (request, response) {
                $.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    url: "api/search/",
                    data: "test",
                    dataType: "text",
                    success: function (data) {
                        response(data.d);
                    },
                    error: function (result) {
                        alert("Error");
                    }
                });
            }
        });
    }

阅读 235

收藏
2020-07-26

共1个答案

小编典典

$.ajax({
    url: '/api/search',
    type: 'POST',
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',
    data: '=' + encodeURIComponent(request.term),
    success: function (data) {
        response(data.d);
    },
    error: function (result) {
        alert('Error');
    }
});

基本上,您只能有一个标量类型的参数,该参数用[FromBody]属性装饰,并且您的请求需要使用application/x-www-form- urlencoded,并且POST有效负载应如下所示:

=somevalue

请注意,与标准协议相反,缺少参数名称。您仅发送值。

您可以在中阅读有关Web Api中的模型绑定如何工作的更多信息this article

但是,当然,这种黑客入侵是一件病态的事情。您应该使用视图模型:

public class MyViewModel
{
    public string Value { get; set; }
}

然后摆脱[FromBody]属性:

public IEnumerable<string> Post(MyViewModel model)
{
    return new string[] { "value1", "value2", model.Value };
}

然后使用JSON请求:

$.ajax({
    url: '/api/search',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ value: request.term }),
    success: function (data) {
        response(data.d);
    },
    error: function (result) {
        alert('Error');
    }
});
2020-07-26