Как передать данные параметров в контроллер в mvc из события Kendo Grid? - PullRequest
0 голосов
/ 07 июня 2018

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

Я думал, что лучшеподход заключается в том, чтобы взять все эти данные, которые мне нужно передать, сохранить их как объект и передать эту полезную нагрузку в контроллер из функции ajax.

Функция ajax запускается из атрибута .event() KendoGrid.

Kendo Grid

@(Html.Kendo().Grid<MyProject.Models.Car>()
    .Name("requirement-grid")
    .Columns(columns =>
    {
        columns.Bound(c => c.Name);
        columns.Command(command => command
            .Custom("Test").Click("payload"));
        })
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("GetCars", "cars"))))

Как вы можете видеть из приведенного выше кода, я использовал пользовательскую команду, которая вызывает функцию, когдаВы нажимаете на это.Функция payload и код:

полезная нагрузка

function payload(e) {
    e.preventDefault();
    //Get row data
    var dataItem = this.dataItem($(e.currentTarget).closest("tr"));

    //Create Object
    var obj = {
        Name: dataItem.Name,
        BHP: dataItem.BHP,
        YearOfBuild: dataItem.YearOfBuild            
    }

    //Post via Ajax
    $.ajax({
        type: 'POST',
        url: '/Controller/Method/',
        data: JSON.stringify({
            array: obj
        }),
        cache: false,
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            console.log("Success");
        },
        error: function (ob, errStr) {
            console.log(ob.responseText);
        }
    });
}

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

Контроллер ожидает параметр, код выглядит следующим образом, но для краткости сокращен.

Контроллер

public ActionResult Create(object[] obj)
    {           
        return View(obj);   
    }

Если я использую "POST" в своей функции ajax, я получаю сообщение об ошибке токена защиты от подделки, которое отсутствует.Если я использую "GET", параметр obj всегда будет нулевым.

Требуемый файл cookie для защиты от подделки "__RequestVerificationToken" отсутствует.

Есть ли лучшеспособ сделать это или мой подход неверен?

1 Ответ

0 голосов
/ 07 июня 2018

Так что это должно быть относительно простым изменением вашего кода.Я предполагаю, что на страницу загружен токен защиты от подделки, и action, на который вы отправляете сообщение, защищен этим.У вас есть два решения:

1) Удалите требование для токена, если оно не нужно, из action в вашем controller

2) Предоставьте токен как частьdata package, который вы отправляете обратно на сервер, изменив код с

 $.ajax({
        type: 'POST',
        url: '/Controller/Method/',
        data: JSON.stringify({
            array: obj
        }),
        cache: false,
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            console.log("Success");
        },
        error: function (ob, errStr) {
            console.log(ob.responseText);
        }
    });

на:

 $.ajax({
   type: 'POST',
   url: '/Controller/Method/',
   data: {
     array: JSON.stringify(obj),
     __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val()
   },

   cache: false,
   dataType: "json",
   contentType: "application/json; charset=utf-8",
   success: function(data) {
     console.log("Success");
   },
   error: function(ob, errStr) {
     console.log(ob.responseText);
   }
 });

Обратите внимание, что я только что добавил ссылку на маркер защиты от подделки какчасть пакета данных для вас, и это должно быть прочитано контроллером и позволить команде успешно завершиться для вас, если у вас есть токен на странице.если нет, то просто добавьте @Html.AntiForgeryToken() к представлению, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...