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



我一直在尝试让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版本?

相关内容

  • 没有找到相关文章

最新更新