C# 如何解决ASP.NET MVC Kendo UI网格中CRUD操作的问题
我一直在尝试让剑道UI网格在我正在编写的系统中充当用户管理工具。我已经将数据绑定到网格,使用ASP.NET标识获取用户信息,但我似乎无法获取网格上要触发的更新或删除操作 我将网格设置如下:C# 如何解决ASP.NET MVC Kendo UI网格中CRUD操作的问题,c#,asp.net-mvc,razor,kendo-grid,asp.net-identity,C#,Asp.net Mvc,Razor,Kendo Grid,Asp.net Identity,我一直在尝试让剑道UI网格在我正在编写的系统中充当用户管理工具。我已经将数据绑定到网格,使用ASP.NET标识获取用户信息,但我似乎无法获取网格上要触发的更新或删除操作 我将网格设置如下: @(Html.Kendo().Grid<MyProject.Models.UserInfo>() .Name("userGrid") .Columns(columns => { columns.Bound(p => p.UserName)
@(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"))
)
)
我的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 not found错误,网格执行的操作是一个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([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---//
}
}
在你的控制器上
public ActionResult UpdateUser([DataSourceRequest] DataSourceRequest request, UserInfo user) ...
public ActionResult DeleteUser([DataSourceRequest] DataSourceRequest request, UserInfo user) ...
对这个
.Read("GetAllUsers", "Admin")
.Update("UpdateUser", "Admin")
.Destroy("DeleteUser", "Admin")
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---//
}
}
public ActionResult UpdateUser([Bind(Prefix=“models”)]IEnumerable updateItems)
{
foreach(updateItems.AsNotNull()中的var updateItem)
{
//--你的代码---//
}
}
public ActionResult DeleteUser([Bind(Prefix=“models”)]IEnumerable deletedItems)
{
foreach(deletedItems.AsNotNull()中的变量deletedItem)
{
//--你的代码---//
}
}
剑道javascript文件的顺序对于正确运行非常重要
确保此引用是在其他剑道脚本之后加载的最后一个引用
<script src="/Scripts/kendo.aspnetmvc.min.js"></script>
有关更多信息,请参见此处:
这个问题与网格执行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版本