This is a migrated thread and some comments may be shown as answers.

[Solved] Kendo UI Grid is posting Create for all Update/Delete/Create and ModelState is Invalid

3 Answers 306 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Inovatecc Inc
Top achievements
Rank 1
Inovatecc Inc asked on 14 Apr 2015, 04:37 AM

When doing Update/Create/Destory operations, two operations get posted to the controller:

First Create operation then a Destroy/Update/Create.

And the ModelState is invalid always.

I have code:

 Client side grid:

            <script>
                $(document).ready(function () {
                    var crudServiceBaseUrl = "",
                        dataSource = new kendo.data.DataSource({
                            transport: {
                                read: {
                                    url: crudServiceBaseUrl + "/Users/Read",
                                    dataType: "json"
                                },
                                update: {
                                    url: crudServiceBaseUrl + "/Users/Edit",
                                    type: "POST",
                                    dataType: "json"
                                },
                                destroy: {
                                    url: crudServiceBaseUrl + "/Users/Destroy",
                                    type: "POST",
                                    dataType: "json"
                                },
                                create: {
                                    url: crudServiceBaseUrl + "/Users/Create",
                                    type: "POST",
                                    dataType: "json"
                                },
                                parameterMap: function (options, operation) {
                                    if (operation !== "read" && options.models) {
                                        return { models: kendo.stringify(options.models) };
                                    }
                                }
                            },
                            batch: true,
                            pageSize: 20,
                            schema: {
                                data: "Data",
                                model: {
                                    id: "ID",
                                    fields: {
                                        ID: { type: "number" },
                                        FirstName: { type: "string" },
                                        LastName: { type: "string" },
                                        Email: { type: "string" },
                                        Password: { type: "string" }
                                    }
                                }
                            }
                        });

                    $("#grid").kendoGrid({
                        dataSource: dataSource,
                        pageable: true,
                        height: 550,
                        toolbar: ["create"],
                        columns: [
                            { field: "FirstName", title: "First Name" },
                            { field: "LastName", title: "Last Name" },
                            { field: "Email", title: "Email" },
                            { field: "Password", title: "Password" },
                            { command: ["edit", "destroy"], title: "&nbsp;", width: "250px" }],
                        editable: "inline"
                    });
                });
            </script>

Controller:

        public ActionResult Read([DataSourceRequest] DataSourceRequest request)
        {
            var users = db.Users.Select<DAL.User, UserViewModel>(u => new UserViewModel
                {
                    ID = u.ID,
                    FirstName = u.FirstName,
                    LastName = u.LastName,
                    Email = u.Email,
                    Password = u.Password
                });

            return this.Json(users.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit([DataSourceRequest] DataSourceRequest request, UserViewModel user)
        {
            if (user != null && ModelState.IsValid)
            {
                var userToUpdate = db.Users.FirstOrDefault<DAL.User>(u => u.ID == user.ID);
                if (userToUpdate != null)
                {
                    userToUpdate.FirstName = user.FirstName;
                    userToUpdate.LastName = user.LastName;
                    userToUpdate.Email = user.Email;
                    userToUpdate.Password = user.Password;

                    db.SaveChanges();
                }
            }

            return Json(new[] { user }.ToDataSourceResult(request, ModelState));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([DataSourceRequest] DataSourceRequest request, UserViewModel user)
        {
            if (user != null && ModelState.IsValid)
            {
                var userToCreate = new DAL.User();
                userToCreate.FirstName = user.FirstName;
                userToCreate.LastName = user.LastName;
                userToCreate.Email = user.Email;
                userToCreate.Password = user.Password;
                db.Users.Add(userToCreate);

                db.SaveChanges();
            }

            return Json(new[] { user }.ToDataSourceResult(request, ModelState));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Destroy([DataSourceRequest] DataSourceRequest request, UserViewModel user)
        {
            if (user != null && ModelState.IsValid)
            {
                var userToDelete = db.Users.FirstOrDefault<DAL.User>(u => u.ID == user.ID);
                if (userToDelete != null)
                    db.Users.Remove(userToDelete);

                db.SaveChanges();
            }

            return Json(new[] { user }.ToDataSourceResult(request, ModelState));
        }

        // GET: Users
        public ActionResult Index()
        {
            return View();
        }

3 Answers, 1 is accepted

Sort by
0
Inovatecc Inc
Top achievements
Rank 1
answered on 14 Apr 2015, 04:41 AM

Only the following events are being generated: 

When Destroy: Create then Destroy

When Update: Create then Update

When Create: Create only

0
Inovatecc Inc
Top achievements
Rank 1
answered on 14 Apr 2015, 05:25 AM

Something seems to be wrong with:

 

 destroy: {
                                    url: crudServiceBaseUrl + "/Users/Destroy",
                                    type: "POST",
                                    dataType: "json"
                                },

parameterMap: function (options, operation) {
                                    if (operation !== "read" && options.models) {
                                        return { models: kendo.stringify(options.models) };
                                    }
                                }

 and the receiving function:

 

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Destroy([DataSourceRequest] DataSourceRequest request, UserViewModel user)

 

The data is there in the parameterMap function but it's empty when it's received in the controller.

0
Alexander Valchev
Telerik team
answered on 15 Apr 2015, 04:26 PM
Hello,

Such issues are usually connected to the model ID.
Could you please confirm that each record has an unique ID value?

Regards,
Alexander Valchev
Telerik
 
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!
 
Tags
Grid
Asked by
Inovatecc Inc
Top achievements
Rank 1
Answers by
Inovatecc Inc
Top achievements
Rank 1
Alexander Valchev
Telerik team
Share this question
or