25

我正在尝试使用 AJAX / Jquery 和 c# 写入我的数据库。每当我将参数传递给 C# 代码时,它都会显示为 null。我正在使用 Visual Studio 在创建控制器类时生成的默认模板。任何帮助,将不胜感激!

注意:这是我试图调用的休息服务。(一个普通的 ASP 网站......不是 MVC。此外,GET Rest api 工作得很好。)

jQuery/AJAX:

var dataJSON = { "name": "test" }

$('#testPostMethod').bind("click", GeneralPost);
function GeneralPost() {
    $.ajax({
        type: 'POST',
        url: '../api/NewRecipe',
        data:JSON.stringify(dataJSON),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    });
}

C#

    //If I remove the [FromBody] Tag then when I click the button this method is never called.
    public void Post([FromBody]string name)

    {

    }

编辑:

我已经稍微调整了我的代码,但仍然遇到同样的问题。回顾一下,它正在加载 POST 方法,但它传入的是 null。

C#

 public class RecipeInformation
    {
        public string name { get; set; }

    }

        public void Post(RecipeInformation information)

        {

        }

阿贾克斯:

    var dataJSON = { information: { name: "test" } };

    $('#testPostMethod').bind("click", GeneralPost);
    console.log(dataJSON);
    function GeneralPost() {
        $.ajax({
            type: 'POST',
            url: '../api/NewRecipe',
            data: dataJSON,
            contentType: 'application/json; charset=utf-8',
        });
    }
4

7 回答 7

56

对于简单类型,在服务器端:

public void Post([FromBody]string name)
{
}

在客户端,您只需定义是否要以 json 格式发送:

    var dataJSON = "test";

    $('#testPostMethod').bind("click", GeneralPost);
    function GeneralPost() {
        $.ajax({
            type: 'POST',
            url: '/api/NewRecipe',
            data: JSON.stringify(dataJSON),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        });
    }

如果要使其以复杂类型工作,则应从服务器端定义:

public class RecipeInformation
{
    public string name { get; set; }
}

public class ValuesController : ApiController
{
    public void Post(RecipeInformation information)
    {
    }
}

从客户端:

    var dataJSON = { name: "test" };

    $('#testPostMethod').bind("click", GeneralPost);
    function GeneralPost() {
        $.ajax({
            type: 'POST',
            url: '/api/NewRecipe',
            data: JSON.stringify(dataJSON),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        });
    }
于 2013-03-29T09:13:46.920 回答
2

我假设您使用的是 ASP.NET WebAPI,它绑定了 URL 中的所有简单类型(int、bool、string 等)和正文中的所有复杂类型。当您用FromBody属性标记名称时,它会从请求正文而不是 url 映射绑定它。

您可以在此处阅读有关 ASP.NET WebAPI 路由和参数绑定的更多信息:

于 2013-03-28T18:17:36.093 回答
2

您可以尝试做这样的事情并使用 jquery param 方法

    var postData = {
        name : 'name'
    }

    $('#testPostMethod').bind("click", GeneralPost);
    function GeneralPost() {
        $.ajax({
            type: 'POST',
            url: '../api/NewRecipe',
            data: $.param(postData,true),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        });
    }
于 2013-03-28T21:50:55.563 回答
1

您缺少的一部分是数据合同属性如果您将课程设置为:

[DataContract]
public class RecipeInformation
{
    [DataMember]
    public string name { get; set; }
}

这些属性可以在 System.Runtime.Serialization 中找到,Json 解析器 (Json.NET) 使用它们来(帮助)反序列化模型。

于 2013-03-28T21:05:33.710 回答
1

API 控制器中的绑定有点奇怪。我相信:

public void Post([FromBody]RecipeInformation information)

var dataJSON = { name: "test" };

应该可以工作,如果你只是将它作为表单数据传递,肯定会工作。

于 2013-03-28T22:26:02.397 回答
0

我在Microsoft Docs Use JS code的帮助下发现了问题, 如前所述

$.post('api/updates/simple', { "": $('#status1').val() });

我错过的是添加空属性名称,所以 OP 需要做的是{"":data:JSON.stringify(dataJSON)},而不是data:JSON.stringify(dataJSON),

于 2017-05-21T20:07:41.903 回答
0

$("#updateuser").click(function () {

        var id = $("#id").val();
        var dataJSON = $("#username").val();

        alert("" + dataJSON);

        $.ajax({


            url: 'http://localhost:44700/api/Home/' + id,
            type: 'PUT',
            data: JSON.stringify(dataJSON),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',

            success: function (data, textStatus, xhr) {
                $.each(data, function (key, val) {
                    $("<li>" + val + "</li>").appendTo($("#names"));
                })
            },
            error: function (xhr, textStatus, errorThrown) {
                alert('Error in Operation');
            }

            })

    })
于 2019-02-15T10:55:03.100 回答