Hi dear Telerik team.
I'm trying to use grid for showing and editing grid in UTC format.
@(Html.Kendo().Grid<
TelerikGridTestApp.Models.ClientViewModel
>()
.Name("Grid")
.Columns(columns =>
{
columns.Bound(p => p.ClientName).Title("Name");
columns.Bound(p => p.ClientBirthday).Format("{d:0}").Title("Start Date").HtmlAttributes(new Dictionary<
string
, object> { { "class", "utc-date" } });
columns.Command(command =>
{
command.Edit();
});
})
.ToolBar(toolbar => toolbar.Create())
.Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("ClientEditor"))
.Pageable(pager => pager.PageSizes(new[] { 10, 20, 30, 50 }))
.Events(e => e.DataBound("onDataBound").Edit("onEdit"))
.HtmlAttributes(new { style = "height: 550px;" })
.Sortable()
.Scrollable()
.Resizable(configurator => configurator.Columns(true))
.Filterable()
.DataSource(dataSource => dataSource
.Ajax()
.Model(model => model.Id(p => p.ClientID))
.Create(create => create.Action("Client_Create", "Grid"))
.Read(read => read.Action("Clients_Read", "Grid"))
.Update(update => update.Action("Client_Update", "Grid"))
.Sort(configurator => configurator.Add(c => c.ClientName))
)
)
I understand that when data comes to browser, it converts to local date time of the browser. So I have to convert it back to UTC date time, and paste to the CELL of the grid.
function
onDataBound() {
$(
".utc-date"
).each(
function
() {
var
text = LocalToUtc($(
this
).text());
$(
this
).text(text);
});
}
Also I do the same for popup dialog
@model TelerikGridTestApp.Models.ClientViewModel
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<
fieldset
>
<
legend
>Client</
legend
>
@Html.HiddenFor(model => model.ClientID)
<
div
class
=
"editor-label"
>
@Html.LabelFor(model => model.ClientName, "Client Name")
@Html.ValidationMessageFor(model => model.ClientName)
</
div
>
<
div
class
=
"editor-field"
>
@Html.EditorFor(model => model.ClientName)
</
div
>
<
div
class
=
"editor-label"
>
@Html.LabelFor(model => model.ClientBirthday, "Client Birthday")
</
div
>
<
div
class
=
"editor-field"
>
@Html.Kendo().DatePickerFor(model => model.ClientBirthday).HtmlAttributes(new { @class = "kendo-utc-date" })
@Html.ValidationMessageFor(model => model.ClientBirthday)
</
div
>
@Html.HiddenFor(model => model.TimeZoneOffsetMinutes)
</
fieldset
>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval");
}
- I change dates using "onEdit" event.
function
onEdit(e) {
if
(e.model.isNew())
return
;
var
datePicker = $($(
"input.kendo-utc-date"
)).data(
"kendoDatePicker"
);
var
utcDate = datePicker .value();
datePicker .value(toLocal(utcDate));
var
timeZoneOffsetControl = $(
"#TimeZoneOffsetMinutes"
);
timeZoneOffsetControl.val(
new
Date().getTimezoneOffset())
timeZoneOffsetControl.change();
}
But when I press "Cancel" button or just close the dialog, the date converts back to local date in the grid. When I press "Update" button, it looks like any mechanism takes the updated date, converts it to UTC (according to my conversion) and shows on front end, but on back end I have correct date.
I figured out that the grid has a storage, and when I update the record, the grid updates the record in the storage and sends the updated record to the back end is separately. It makes sense if I update regular string or number. But What should I do in my case?