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

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

推荐答案

$.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

请注意,与标准协议相反,缺少参数名.您只发送了值.

您可以阅读更多关于WebAPI中的模型绑定如何在this article中工作的信息.

当然,这种黑客行为是一种病态的行为.应使用视图模型:

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

然后go 掉[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');
    }
});

Asp.net相关问答推荐

DataTables-如何修改来自JSON响应或其他DataTables参数的无结果(ZeroRecords)消息

禁用托管优化并重新启动调试实际上在 Visual Studio 中更改了哪些设置?

在 ASP.Net 中使用 Page_Load 和 Page_PreRender

IIS 中 ASP.net 应用程序的单独应用程序池

System.Web.Helpers.Crypto - 盐在哪里?

如何使用 jQuery 设置 outerHTML

如何将 Castle Windsor 与 ASP.Net Web 表单一起使用?

asp.net mvc 中的 RedirectToAction 用法

如何以编程方式获取会话 cookie 名称?

文本框的输入按键触发事件

'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册.

相当于服务器端的 ASP.NET 包括

缩小失败.返回未缩小的内容

如何将枚举类型绑定到 DropDownList?

应该如何使用 RedirectToRoute?

为什么混合 Razor Pages 和 VueJs 是一件坏事?

Asp.Net Mvc - 如何在共享视图中有一个控制器

避免将重复元素添加到列表 C#

脚本管理器控制实际上是做什么的?

解析器错误:此处不允许使用_Default,因为它没有扩展类System.Web.UI.Page和 MasterType 声明