AJAX POST-запрос не передает данные в метод контроллера в ASP.NET Core 2.2 - PullRequest
0 голосов
/ 27 февраля 2019

Прежде чем я начну, я хотел бы сказать - я понимаю, что этот вопрос очень похож на многие другие, которые были размещены на этом сайте и даны ответы на них.Я прочитал и попробовал столько решений, сколько смог найти, связанных с моей проблемой, но ни одно из них до сих пор не сработало.

Я пытаюсь передать данные со своей веб-страницы в метод контроллера.Веб-страница очень проста и требует только сбора информации, вводимой пользователем, и отправки ее.Я использую Kendo Grid от Telerik для привязки и организации своих данных.Независимо от того, что я пытаюсь, мой почтовый запрос AJAX никогда не передает параметры правильно.При использовании отладчика моего браузера я вижу, что параметры, передаваемые в запрос AJAX, действительны, но к тому времени, когда они достигают моей точки останова в методе контроллера, все они имеют значение null или значение по умолчанию.

Функция, содержащая запрос AJAX

function saveShiftDataToServer() {
    var grid = $("#myGrid").data("kendoGrid");
    var dataSource = grid.dataSource;
    var allData = dataSource.data();
    var comments = '@Model.Comments';
    var loadInfoCorrect = '@Model.LoadInfoCorrect';

    $.ajax({
        type: "POST",
        url: '/Home/SaveData',
        data: JSON.stringify({ accessorials: allData, comments: comments, loadInfoCorrect: loadInfoCorrect }),
        contentType: "application/json; charset=utf-8",
        datatype: "json"
    })
}

Метод контроллера

[AcceptVerbs("Post")]
public ActionResult SaveData(Accessorial[] accessorials, string comments, bool loadInfoCorrect)
{
    // Code removed for brevity
}

Моя Кендо Сетка напечатана как Accessorial (первый тип параметра метода контроллера),поэтому я предполагаю, что получение коллекции всех существующих строк должно возвращать массив этой модели.Несмотря на это, «comments» - это строка, но она передается методу контроллера только как ноль.

Я новичок в ASP.NET Core и Kendo, поэтому я уверен, что есть нечто очевидное, чтоЯ скучаю.Любая помощь будет оценена!

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вы можете передать все свои данные в ViewModel и получить к ним доступ, используя [FromBody] при действии

public class ViewModel
    {
        public List<Accessorial> Accessorials{ get; set; }
        public string Comments { get; set; }
        public bool LoadInfoCorrect { get; set; }
    }

Ajax:

var model = {};//pass all you data to an object
        model.Accessorials = allData ;
        model.comments = comments ;
        model.loadInfoCorrect = loadInfoCorrect;

        var items = JSON.stringify(model);        

        $.ajax({
            url: '/GetAllCustDetails/SaveData',
            type: "POST",
            data: items,
            contentType: 'application/json; charset=utf-8',
            //dataType: "json",
            success: function (response) {
                alert("111");
            }
        });

Контроллер:

[HttpPost]
public ActionResult SaveData([FromBody]ViewModel model)
0 голосов
/ 01 марта 2019

Я ценю все ответы!Мне удалось наконец увидеть действительные данные в моем контроллере, изменив тип данных AJAX на «текстовый» и просто передав JSON напрямую для десериализации на стороне сервера.По какой-то причине это единственный способ, которым я смог сделать эту работу до сих пор.

AJAX POST Call

function saveShiftDataToServer() {
    var grid = $("#accessorialGrid").data("kendoGrid");
    var dataSource = grid.dataSource;
    var allData = dataSource.data();

    var shiftOverview = {
        ShiftId: 0,
        UserName: "test",
        ShiftDate: null,
        LoadList: null,
        AccessorialList: allData,
        LoadInfoCorrect: true,
        Comments: ""
    };        
    var jsonData = JSON.stringify(shiftOverview);

    $.ajax({
        type: "POST",
        url: '/Home/SaveData',
        data: { json: jsonData },
        datatype: "text",
        success: function (response) {
                alert("111");
            }
        })
}

Метод контроллера

[AcceptVerbs("Post")]
public ActionResult SaveData(string json)
{
    JsonConvert.DeserializeObject<ShiftOverview>(json); // This produces an object with valid data!
}
0 голосов
/ 27 февраля 2019

Вы передаете JSON объект, который соответствует C# объекту, подобному этому:

public class Model {
    public Accessorial[] Accessorials { get; set; }
    public string Comments { get; set; }
    public bool loadInfoCorrect { get; set; }
}

Попробуйте объявить такой класс выше и настроить свой метод действия следующим образом:

public ActionResult SaveData(Model model)
{
    // Code removed for brevity
}

Если не поможет - задайте параметр модели object и проверьте в режиме отладки, что вы получаете от вызова AJAX.

...