Как обновить определенные поля в сетке Kendo, в которой отображаются связанные данные? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть таблица KendoUI, которая показывает связанные данные через представление в моей базе данных SQL. Две таблицы, которые он показывает: Cars и Bookings

Таблица: Автомобили

  • public int Id
  • публичная строка Reg
  • публичная строка Make
  • публичная строка Модель
  • публичная строка Тип
  • публичная строка Fuel

Таблица: Бронирование

  • public int Id
  • открытая строка Примечания
  • public DateTime BookingStart
  • общедоступная дата / время бронированияEnd
  • 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#" })))

))

Мы разрешаем пользователю использовать встроенные функции редактирования сетки и обновлять детали. Проблема, с которой я сталкиваюсь, заключается в том, что, когда изменения передаются из таблицы, параметром «Методы обновления» является вся модель (автомобили и заказы), которая перезаписывает все поля, которые НЕ находятся в таблице, как 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));
    }

Когда вы пытаетесь обновить, параметр передает всю модель как для автомобиля, так и для бронирования, и устанавливает пустые поля в сетке, что стирает существующие данные. Можно ли как-то сказать моему методу, чтобы он обновлял только поля, переданные из таблицы, и оставил оставшиеся данные без изменений?

1 Ответ

0 голосов
/ 31 августа 2018

Это то, что мы делаем.

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...