Подтвердить что ты не робот

AJAX & Web Api Post Method - Как это работает?

Я пытаюсь записать в мою базу данных с помощью AJAX/JQuery и С#. Всякий раз, когда я передаю параметр в код С#, он показывает как null. Я использую шаблон по умолчанию, создаваемый visual studio при создании класса контроллера. Любая помощь будет оценена!

NOte: Это сервис отдыха, который я пытаюсь вызвать. (Обычный веб-сайт 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'
            });
        }

С#

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

    {

    }

EDIT:

Я немного скорректировал свой код, но я все еще сталкиваюсь с той же проблемой. Чтобы повторить, он загружает метод POST, но он передает значение null.

С#

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

    }

        public void Post(RecipeInformation information)

        {

        }

AJAX:

    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',
        });
    }
4b9b3361

Ответ 1

Для простого типа на стороне сервера:

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

Ответ 2

Я предполагаю, что вы используете ASP.NET WebAPI и связываете все простые типы (int, bool, string и т.д.) с URL-адресом и всеми сложными типами из тела. Когда вы отметили имя с атрибутом FromBody, тогда он связывает его с телом запроса вместо отображения URL.

Подробнее о маршрутизации и привязке параметров ASP.NET WebAPI вы можете узнать здесь:

Ответ 3

Вы можете попробовать сделать что-то подобное и использовать метод 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'
        });
    }

Ответ 4

Связывание в контроллерах API немного странно. Я верю:

public void Post([FromBody]RecipeInformation information)

с

var dataJSON = { name: "test" };

должен работать, и определенно будет работать, если вы просто передадите его как данные формы.

Ответ 5

В этом случае вам не хватает атрибутов контракта данных Если вы сделаете свой класс следующим:

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

Эти атрибуты находятся в System.Runtime.Serialization, а парсер Json (Json.NET) использует их для (дескрипции) десериализации модели.

Ответ 6

Я нашел проблему с помощью Документы Microsoft Использовать JS-код, упомянутый

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

То, что я пропустил, это добавить пустое имя свойства, так что OP должен сделать, это {"":data:JSON.stringify(dataJSON)}, вместо data:JSON.stringify(dataJSON),