我一直在尝试让Kendo UI网格在我目前正在编写的系统中充当用户管理工具。我已经使用ASP将数据绑定到网格。NET Identity来获取用户信息,但我似乎无法获取要在网格上启动的更新或删除操作。
我将网格设置如下:
@(Html.Kendo().Grid<MyProject.Models.UserInfo>()
.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<UserInfo> updatedItems)
{
foreach (var updatedItem in updatedItems.AsNotNull())
{
//--your code---//
}
}
public ActionResult DeleteUser([Bind(Prefix = "models")]IEnumerable<UserInfo> deletedItems)
{
foreach (var deletedItem in deletedItems.AsNotNull())
{
//--your code---//
}
}
Kendo javascript文件的顺序对于正常工作非常重要。
确保这个引用是在其他剑道脚本之后加载的最后一个引用。
<script src="/Scripts/kendo.aspnetmvc.min.js"></script>
请参阅此处了解更多信息:
http://docs.kendoui.com/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版本?