如何解决ASP.NET MVC Kendo UI网格中的CRUD操作问题

我一直在努力让Kendo UI网格充当我正在编写的系统中的用户管理工具。 我已将数据绑定到网格,使用ASP.NET Identity获取用户信息,但我似乎无法获取更新或删除操作以触发网格。

我把网格设置如下:

@(Html.Kendo().Grid() .Name("userGrid") .Columns(columns => { columns.Bound(p => p.UserName); columns.Bound(p => p.FirstName); columns.Bound(p => p.LastName); columns.Bound(p => p.Region); columns.Bound(p => p.Roles); columns.Command(command => { command.Edit(); command.Destroy(); command.Custom("ViewDetails").Click("showDetails"); }); }) .Filterable() .Sortable() .Navigatable() .Resizable(r => r.Columns(true)) .Editable(editable => { editable.Mode(GridEditMode.InLine); editable.DisplayDeleteConfirmation("Are you sure you want to delete this user?"); }) .HtmlAttributes(new { style = "min-height:90px;max-height:450px;" }) .DataSource(dataSource => dataSource .Ajax() .Model(model => { model.Id(p => p.UserId); model.Field(p => p.UserId).Editable(false); model.Field(p => p.FirstName).Editable(true); model.Field(p => p.LastName).Editable(true); model.Field(p => p.UserName).Editable(true); model.Field(p => p.Roles).Editable(false); model.Field(p => p.Region).Editable(false); } ).Read(read => read.Action("GetAllUsers", "Admin")) .Update(update => update.Action("UpdateUser", "Admin")) .Destroy(update => update.Action("DeleteUser", "Admin")) ) ) 

我的模型定义为:

 public class UserInfo { public string UserId {get;set;} public string FirstName {get;set;} public string LastName {get;set;} public string UserName {get;set;} public string Roles {get;set;} public string Region {get;set;} } 

我的AdminController包含以下方法:

  [AcceptVerbs(HttpVerbs.Get)] public ActionResult GetAllUsers([DataSourceRequest]DataSourceRequest request) { using (var context = new ApplicationDbContext()) { var users = context.Users.ToList(); var moreUsers = users.Select(x => new UserInfo { UserName = x.UserName, UserId = x.Id, FirstName = x.FirstName, LastName = x.LastName, Region = x.RegionId.ToString(), Roles = string.Join(", ", x.Roles.Select(p => p.Role.Name).ToList()) }).ToList(); return Json(moreUsers.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); } } [AcceptVerbs(HttpVerbs.Post)] public ActionResult UpdateUser([DataSourceRequest] DataSourceRequest request, UserInfo user) { if (user != null && ModelState.IsValid) { //userService.Update(user); } return Json(new[] { user }.ToDataSourceResult(request, ModelState)); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult DeleteUser([DataSourceRequest] DataSourceRequest request, UserInfo user) { if (user != null && ModelState.IsValid) { //userService.Update(user); } return Json(new[] { user }.ToDataSourceResult(request, ModelState)); } 

目前,当我单击“删除”按钮时,我收到404未找到错误,并且网格执行的操作是格式为GET:localhost / MyProject / Admin / DeleteUser?UserId = x,FirstName = y …我不能为我的生活解决为什么会发生这种情况,因为我认为我已经非常准确地遵循了演示中的示例 。

有没有人帮我?

尝试在您的视图中更改此视图

 .Read(read => read.Action("GetAllUsers", "Admin")) .Update(update => update.Action("UpdateUser", "Admin")) .Destroy(update => update.Action("DeleteUser", "Admin")) 

对这一个

 .Read("GetAllUsers", "Admin") .Update("UpdateUser", "Admin") .Destroy("DeleteUser", "Admin") 

并在您的控制器上

 public ActionResult UpdateUser([DataSourceRequest] DataSourceRequest request, UserInfo user) ... public ActionResult DeleteUser([DataSourceRequest] DataSourceRequest request, UserInfo user) ... 

对这一个

 public ActionResult UpdateUser([Bind(Prefix = "models")]IEnumerable updatedItems) { foreach (var updatedItem in updatedItems.AsNotNull()) { //--your code---// } } public ActionResult DeleteUser([Bind(Prefix = "models")]IEnumerable deletedItems) { foreach (var deletedItem in deletedItems.AsNotNull()) { //--your code---// } } 

Kendo javascript文件的顺序对于正常工作非常重要。

确保此引用是在其他kendo脚本之后加载的最后一个引用。

   

请看这里了解更多信息:

http://docs.kendoui.c​​om/getting-started/using-kendo-with/aspnet-mvc/helpers/grid/troubleshooting

问题与网格执行GET而不是POST有关,但不幸的是,hutchonoid提供的解决方案无效。 这将所有网格操作都更改为post,包括GET操作。 但是,它确实让我找到了合适的解决方案。

给另一个问题的答案实际上解决了这个问题。 为了让我的网格工作,我明确定义了网格操作应该采取的操作:

 .Read(read => read.Action("GetAllUsers", "Admin").Type(HttpVerbs.Get)) .Update(update => update.Action("UpdateUser", "Admin").Type(HttpVerbs.Post)) .Destroy(update => update.Action("DeleteUser", "Admin").Type(HttpVerbs.Post)) 

我还不完全确定为什么Telerik演示在没有定义动作类型的情况下工作,但我猜它与脚本有关。 也许我正在使用的jQuery版本?