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

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)

我一直在尝试让剑道UI网格在我正在编写的系统中充当用户管理工具。我已经将数据绑定到网格,使用ASP.NET标识获取用户信息,但我似乎无法获取网格上要触发的更新或删除操作

我将网格设置如下:

    @(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版本