【问题标题】:Problems sending an AJAX post where the data is a simple string to ASP.NET 5 WEB API向 ASP.NET 5 WEB API 发送数据是简单字符串的 AJAX 帖子时出现问题
【发布时间】:2016-04-25 14:00:00
【问题描述】:

我的目标是向 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;
    }

最奇怪的是,当我使用 postman 或 fiddler 并在原始正文中发送类似这样的内容时:

{"name":"John"}

它工作得很好。为什么它不适用于 AJAX 请求?我的动态参数最终为空。

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

【问题讨论】:

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


    【解决方案1】:

    您需要使用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");
         ...
    }
    

    【讨论】:

    • 我尝试使用 JSON.stringify 并且我的 [FromBody]dynamic 值仍然为空。我更新了我的帖子以显示我目前拥有的内容。出于某种原因,在新的 ASP.NET Web API 中,我觉得您必须使用模型绑定。我试图绕过这一点,只需将一个字符串发送到我的控制器中的方法并返回一个简单的字符串。很奇怪,当我通过提琴手发送请求时它起作用了。它实际上创建了一个动态对象,我可以简单地调用 myObj.name 来获取值。
    • 嗯,在我的 vs 解决方案中,我有一个 asp.net web mvc 项目和一个 asp.net web api 项目。我认为问题在于 mvc 项目在 localhost:57068 下运行,而 web api 项目在 localhost:27081 下运行,我认为浏览器不允许跨站点的 AJAX 请求。
    • 跨站点问题与 Chrome 有关,现在我不想处理它,所以我只是在同一个项目中添加了一个 Controllers/api 文件夹。很奇怪,我的视图模型仍然没有绑定。它始终为空。
    • @BlakeRivell,查看我的更新。抱歉耽搁了。我来自奥兹国。
    • 感谢您的更新。我弄清楚我的问题是什么。我没有将 contentType 指定为 application/json,因此数据没有正确传递给 web api。结合 application/json 作为 contentType 和 JSON.stringify 它工作!感谢您让我了解 JSON.stringify。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2019-08-08
      • 1970-01-01
      • 2014-09-15
      相关资源
      最近更新 更多