Ajax объект данных в качестве аргумента контроллера равен нулю - PullRequest
0 голосов
/ 07 марта 2020

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

[HttpPost]
public ActionResult EditStudent(Student student) 
{
    //do something
}

Ajax вызов:

$('#submitEdit').click(function () {
    var object = 
        {
            Id: $('#StudentId').val(),
            StudentName: $('#StudentName').val(),
            Age: $('#Age').val(),
        };
    $.ajax({
        url: '/Controller/EditStudent',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        type: 'POST',
        data: {"Student" : JSON.stringify(object)},
        success: function (data) {
            debugger;
        },
        error: function (data) {
            debugger;
        }
    });
});

К сожалению, все в моем аргументе является нулевым. Я уверен, что значения, которые я получаю из соответствующих идентификаторов (#StudentId, #StudentName, #Age), в порядке.

Помимо вышесказанного, я попытался добавить [FromBody] перед параметром в моем методе без какого-либо эффекта.

1 Ответ

0 голосов
/ 07 марта 2020

Как я уже писал в комментарии, удаление contentType, dataType и JSON.stringify решает вашу проблему. Таким образом, запрос генерируется с помощью Content-Type: application/x-www-form-urlencoded; charset=UTF-8, а параметры формируются как Student%5BId%5D=1&Student%5BStudentName%5D=2&Student%5BAge%5D=3.

. Проблема, с которой я сам борюсь, заключается в том, почему [FromBody] не работает в ядре asp. net. 3 MVC контроллер. То, как я делаю это там, где мне нужно получить JSON, выглядит примерно так:

[HttpPost]
public ActionResult EditStudent() 
{
    using (var bodyStreamReader = new System.IO.StreamReader(Request.Body)) {
        var bodyText = await bodyStreamReader.ReadToEndAsync();
        var student = JsonConvert.DeserializeObject<Student>(bodyText);
        //do something
    }
}

Если вы измените свое действие следующим образом, я думаю, что вы получите объект student из ajax Звоните, вы написали в OP.

Обновление

Я выяснил, почему [FromBody] не работает для меня. У меня было несколько примитивных типов в качестве аргументов. Когда я переключил их с одной моделью, он работал отлично.

В OP ajax должно быть как

$.ajax({
    url: '/Controller/EditStudent',
    contentType: "application/json; charset=utf-8",
    type: 'POST',
    data: JSON.stringify(object),
    success: function (data) {
        debugger;
    },
    error: function (data) {
        debugger;
    }
});

И C# код будет похож на

[HttpPost]
public ActionResult EditStudent([FromBody]Student student) 
{
    //do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...