如何更新显示相关数据的Kendo Grid中的特定字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更新显示相关数据的Kendo Grid中的特定字段?相关的知识,希望对你有一定的参考价值。

我有一个KendoUI网格,通过我的SQL数据库中的视图显示相关数据。它显示的两个表是CarsBookings

表:汽车

  • public int Id
  • 公共字符串Reg
  • public string Make
  • 公共字符串模型
  • public string Type
  • 公共字符串燃料

表:预订

  • public int Id
  • 公共字符串注释
  • public DateTime BookingStart
  • public DateTime BookingEnd
  • public int Car_Id

网格的代码是:

@(html.Kendo().Grid<MyProject.ViewModels.CarBookings>()
.Name("Bookings")
.Columns(columns => {
    columns.Bound(c => c.Id);
    columns.Bound(c => c.BookingId);
    columns.Bound(c => c.Reg);
    columns.Bound(c => c.Make);
    columns.Bound(c => c.Model);
    columns.Bound(c => c.BookingStart).Format("{0:dd/MM/yyyy}");
    columns.Bound(c => c.BookingEnd).Format("{0:dd/MM/yyyy}");
    columns.Command(command => { command.Edit(); }).Width(250);
})
.Pageable()
.Sortable()
.Groupable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
    .Ajax()
    .Model(model => {
        model.Id(p => p.Id);
        model.Field(p => p.Id).Editable(false);
        model.Field(p => p.Car_Id).Editable(false);
    })
    .Read(read => read.Action("GetBookings", "Bookings"))
                        .Update(update => update.Action("UpdateBookings", "Bookings", new { BookingId = "#=BookingId#" })))

))

我们允许用户使用网格的内联编辑功能并更新详细信息。我遇到的问题是,当从网格提交更改时,Update方法参数是整个模型(汽车和预订),它覆盖了网格中不存在的所有字段null,有效地擦除了我的数据,除了更新的项目。

为了解决这个问题,我想我可以使用[Bind(Include = "")]并指定我想要更新的字段,而EF将保留其余部分,但它不起作用。

这是UpdateBooking方法,尝试更新两个表并指定我想要更新的字段。

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult UpdateBookings([DataSourceRequest] DataSourceRequest request, [Bind(Include = "Reg, Make, Model")]  Cars car, [Bind(Include = "BookingStart, BookingEnd")] Bookings booking, int BookingId, BookingsViewModel vm)
    {
        if (ModelState.IsValid)
        {
            unitOfWork.CarRepository.Update(car);                
            booking.Id = BookingId;
            unitOfWork.BookingRepository.Update(booking);
            unitOfWork.Save();
        }

        return Json(new[] { vm }.ToDataSourceResult(request, ModelState));
    }

当您尝试更新时,参数会传递汽车和预订的整个模型,并将不在网格中的字段设置为null,从而消除现有数据。有什么方法可以告诉我的方法只更新从网格传入的字段并保留其余的数据完好无损?

答案

这就是我们的工作。

public JsonResult Update([DataSourceRequest] DataSourceRequest request, MyViewModel myViewModel)
{
    if (ModelState.IsValid)
    {
        // Get 1st entity to update
        var myEntity = _db.MyEntities.Single(s => s.MyID == myViewModel.MyID);

        // Automapper will copy the viewmodel fields to the entity (could do manually as well)
        Mapper.Map(myViewModel, myEntity);

        // Repeat for 2nd entity...

        _db.SaveChanges();

        // May need to refresh viewmodel if other fields were affected by insert/update
    }

    return Json(new[] { myViewModel }.AsQueryable().ToDataSourceResult(request, ModelState));
}

以上是关于如何更新显示相关数据的Kendo Grid中的特定字段?的主要内容,如果未能解决你的问题,请参考以下文章

Kendo Grid 如何更新、创建、删除数据源

即使没有数据,也可以在 Kendo Grid 中显示固定的行数?

如何使用 ASP.NET MVC 在 Kendo UI Grid 中实现 N 级嵌套层次结构

更新 ViewModel 时如何防止 Kendo UI Grid 多次重新绑定

如何在加载kendo-grid时显示kendo加载图标?

即使没有更新数据,如何强制 Kendo 网格更新