Я использую библиотеку ASP.NET MVC Kendo с элементом управления Grid, с режимом GridEditMode.PopUp для добавления / редактирования.У меня есть более 20 экранов, которые используют элемент управления, на котором я разрешаю действия Создать и Обновить.Большинство моделей имеют диапазоны дат, даты начала и окончания, которые являются объектами DateTime в EntityFramework.
Вопрос в двух словах:
Как я могу получить добавленную / отредактированную запись для немедленного обновления с серверапосле сохранения?Этот вопрос не зависит от деталей моей реальной проблемы, описанной ниже.Я хочу, чтобы сохраненная запись отправлялась на сервер, а затем выполнялась операция «Чтение» с сервера, чтобы все события, которые обычно запускаются при загрузке сетки, применялись к этой одной записи.
Мои события создания / обновления выполняютсохранить в БД, затем просто: return Json(new[] { myModelObject }.ToDataSourceResult(request, ModelState));
Я пытался:
onSync - думал, что это вызовет обновление сетки, так что новая запись будет извлечена изсервер.
Технически решаем проблему.Новая запись имеет дату, как она была введена.Плохо, потому что вам приходится ждать обновления сетки, и вы теряете позицию новой / отредактированной записи (она сортируется там, где она принадлежит).
Еще хуже: ошибки ModelStateдобавляются на сервер, это как-то обходит все это.Что происходит, ответ возвращается, ошибки эстакады показываются, но синхронизация срабатывает (я полагаю, потому что проверка клиента прошла успешно, и он не знает, как увидеть ошибки ModelState).Синхронизация запускает обновление сетки.Обновление сетки закрывает всплывающее окно Добавить.Итак, пользователь видит, как окно исчезает.
AutoSync (true) - обнаружил это на объекте Grid и подумал, что это похоже на решение.Я думаю, что это будет синхронизировать при сохранении записи.Тем не менее, он вызывает мое действие «Создать», когда просто нажимаю кнопку «Добавить», чтобы загрузить всплывающее окно.Неожиданное поведение и не могу придумать вариант использования для этого
Я хотел бы знать, как этого добиться, даже если проблему, которую я пытаюсь решить ниже, можно обойти впо-другому.Я думаю, что должен быть способ доступа к Сохраненному элементу данных, и я думаю, что мне нужно будет сделать это в будущем.
В частности, почему я хочу сделать это в первую очередь:
Я хочу, чтобы любой ввод даты в диалоге добавления / редактирования полностью игнорировал концепцию времени.Если я нахожусь по восточному времени и ввожу 12/01/2018, то «12/01/2018 00:00:00» - это то, что я хочу POST.Если пользователь открывает эту запись по тихоокеанскому времени, он видит «12/01/2018 00:00:00».Я не хочу преобразовывать все в строку, так как это кажется плохой практикой, и тогда сортировка / фильтрация в Kendo не будет работать должным образом (я предполагаю).
Справочная информация. Моя проблема заключается в том, что при добавлении или измененииДата в сетке смещена по местному часовому поясу машины.Таким образом, вы можете добавить новую запись, ввести 12/01/2018 в DatePicker (время не доступно), а затем в Grid, верхняя строка показывает 30/11/2018.Используя консоль и глядя на объект, я вижу [дата] чт 30 ноября 2018 23:00:00 GMT-0600 (центральное стандартное время) .Тем не менее, контроллер получает 12/01/18 00: 00: 00 (что правильно).
Я уже обращался к этой проблеме с помощью Reads, потому что изначально EVERY запись в моей сетке была смещена (пользователи заметили, что каждая дата была за 1 день до фактической даты в базе данных).Я нашел несколько статей, в которых указывалось использование события requestEnd для циклического перебора значений, а для строк "/ Date (" замените числовое значение на kendo.timezone.apply(new Date(parseInt(n)), "Etc/UTC").getTime();
. Это прекрасно работает ... когда Grid обновляется с сервера. Я могу использовать EntityFrameworkустановите DateTime.Kind в UTC для всех объектов DateTime, затем кендо смещает все локальные объекты Date в объекты даты UTC. Возвращает его к полуночи в соответствующий день.
Однако добавление / редактирование НЕ обновляются с сервера.Таким образом, события EF и событие requestEnd Kendo не происходят при добавлении / редактировании.Кажется, что Kendo POST передает данные на сервер, а затем говорит: «Я уже знаю эти значения, поэтому я собираюсь просто скопировать поля ввода формы непосредственно в сетку».Эффективно, но это обходит мою логику смещения.
Вот пример свойства Model:
[Column(Order = 10, TypeName = "smalldatetime")]
[UIHint("Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
[DisplayName("Start Date")]
public DateTime startDate { get; set; }