У меня есть таблица 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));
}
Когда вы пытаетесь обновить, параметр передает всю модель как для автомобиля, так и для бронирования, и устанавливает пустые поля в сетке, что стирает существующие данные. Можно ли как-то сказать моему методу, чтобы он обновлял только поля, переданные из таблицы, и оставил оставшиеся данные без изменений?