如何通过Kendo Grid事件将参数数据传递给mvc中的控制器?

时间:2018-06-07 08:39:30

标签: javascript jquery ajax asp.net-mvc kendo-ui

我想将我的ajax函数中的大量参数传递给我的控制器。最初,我以为我会使用查询字符串来执行此操作,但这并没有给我我想要的结果,尽管它创建了一个没有吸引力的URL,我添加的数据越多。

我认为更好的方法是获取我需要传递的所有数据,将其存储为对象并将该有效负载从ajax函数传递到控制器中。

ajax函数是从.event()的{​​{1}}属性触发的。

Kendo Grid

KendoGrid

从上面的代码中可以看出,我使用了一个自定义命令,当你点击它时会触发一个函数。函数为@(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

我访问被点击的行的数据并通过events参数传递给它,从那里我创建了一个对象并将数据添加到它。然后我创建一个ajax调用并尝试将其传递给控制器​​。

控制器需要参数,代码如下,但为了简洁起见缩短了。

控制器

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

如果我在我的ajax函数中使用public ActionResult Create(object[] obj) { return View(obj); } ,我会收到一个错误的防伪令牌错误。如果我使用"POST""GET"参数始终为空。

  

所需的防伪cookie“__RequestVerificationToken”不存在。

有更好的方法可以做到这一点,还是我的方法不正确?

1 个答案:

答案 0 :(得分:1)

所以这应该是对代码的一个相对简单的更改。我假设您在页面上加载了防伪令牌,并且您发布的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()添加到视图中就可以了。