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: " ", 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();
}