向 5 WEB API 发送数据为简单字符串的 AJAX 帖子时出现问题 ASP.NET

本文关键字:AJAX NET ASP 问题 字符串 API WEB 简单 数据 | 更新日期: 2023-09-27 18:31:07

我的目标是向 5 web api 方法发送一个字符串并 asp.net 然后让该方法简单地返回一个字符串作为结果。

这是我的js:

    $("#btnChangeName").click(function() {
        var prodName = $("#txtProductName").val();
        var url = 'http://localhost:27081/api/products/changename';
        $.ajax({
            url: url,
            type: 'POST',
            dataType: 'text',
            data: JSON.stringify({name: prodName}),
            success: successFuncApi,
            error: function(xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
            }
        });
    });

控制器:

    [HttpPost]
    [Route("/api/functions/changename")]
    public string ChangeName([FromBody]dynamic value)
    {
        string newName = ChangeNameHelper(value.name.ToString());
        return newName;
    }

最奇怪的是,当我使用邮递员或小提琴手并在原始正文中发送类似的东西时:

{"name":"John"}

它工作完全正常。为什么它不适用于 AJAX 请求?我的动态参数最终为空。

是否 100% 要求始终绑定到新 Web API 中的模型?在这种情况下,我只处理一个简单的字符串输入和一个简单的字符串输出。

向 5 WEB API 发送数据为简单字符串的 AJAX 帖子时出现问题 ASP.NET

您需要

使用 JSON.stringify 序列化数据。

因此,请尝试替换此内容:

data: {name: name}

有了这个:

data: JSON.stringify({name: name})

JSON可用于现代浏览器。但是,如果您需要支持 IE8,或者您的浏览器不支持它,则需要包含 json2

更新

@Blake,这是我对您的评论的回应:它太长了,无法放在评论部分。

我以前没有使用dynamic将复杂类型接收到我的 Web API 中。但是,我使用了JToken.然后,您可以像这样访问name属性:

public string ChangeName([FromBody]JToken jsonbody)
{
     var name = jsonbody.Value<string>("name");
     ...
}

您无需创建对象即可发送字符串。这将起作用。

[HttpPost]
[Route("/api/functions/changename")]
public string ChangeName([FromBody]string value)
{
    string newName = ChangeNameHelper(value=);
    return newName;
}

诀窍是发送 JSON 字符串,而不仅仅是字符串。它们是不一样的。

$("#btnChangeName").click(function() {
    var prodName = $("#txtProductName").val();
    var url = 'http://localhost:27081/api/products/changename';
    $.ajax({
        url: url,
        type: 'POST',
        dataType: 'text',
        contentType:'application/json',
        data: JSON.stringify(prodName),
        success: successFuncApi,
        error: function(xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    });
});