发送AJAX帖子的问题,其中数据是ASP.NET 5 WEB API的简单字符串

时间:2016-01-19 22:10:55

标签: c# asp.net ajax asp.net-web-api asp.net-core

我的目标是将字符串发送到asp.net 5 web api方法,然后让方法只返回一个字符串作为结果。

这是我的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中的模型?在这种情况下,我只处理一个简单的字符串和一个简单的字符串输出。

2 个答案:

答案 0 :(得分:4)

您需要使用JSON.stringify序列化数据。

所以尝试替换它:

data: {name: name}

用这个:

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

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

<强>更新

@Blake,这是我对你的评论的回复:放入评论部分太长了。

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

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

答案 1 :(得分:0)

您无需创建发送字符串的对象。这将有效。

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