Telerik Kendo UI ASP.NET MVC Grid - обработка событий сохраненных данных - PullRequest
0 голосов
/ 30 ноября 2018

Я использую библиотеку 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; }

1 Ответ

0 голосов
/ 05 декабря 2018

Возвращаете ли вы пустой объект после обновления ?:

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

Вместо того, чтобы возвращать обновленный объект (этот Telerik обновит локальные данные и, будем надеяться, автоматически исправит проблему?).

return Json(service.Read(updatedId).ToDataSourceResult(request, ModelState));

Обычно я не возвращаю обновленный объект, потому что я хотел бы получить те же "исправления", что и при обычном чтении ... А когда вы возвращаете объект, я предполагаю, что telerik запустит requestEnd иисправить дату на обновленной записи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...