#c# #asp.net #asp.net-mvc #asp.net-mvc-5
#c# #asp.net #asp.net-mvc #asp.net-mvc-5
Вопрос:
Я унаследовал приложение, которое хранит даты по местному времени. Я модернизировал его и неохотно продолжил с бизнес-уровнем, который имеет дело с датами по местному времени.
Мои сообщения на сервер в формате JSON, и я написал Javascript, который отправляет их на сервер с включенной информацией о смещении, например
{"name":"aal","dob":"1921-10-06T00:00:00 10:30"}
Однако, ASP.NET десериализует это как UTC. Итак, если я выберу 6 июля 2016 года в окне выбора даты, сервер десериализует его как 5 июля 2016 года.
Мой вопрос прост. Как я могу договориться о встрече между клиентом и сервером. Если я выберу 6 июля, я хочу сохранить 6 июля (очевидно).
Примечание: это НЕ WebAPI. Старый добрый ванильный MVC 5.
Для одного клиента я добавляю следующий код, чтобы гарантировать, что полезная нагрузка JSON, которая отправляется на сервер, не является UTC:
// Include offset info in the JSON that gets posted to the server.
Date.prototype.toJSON = function() {
return moment(this).format();
}
Затем я использую следующий код для его публикации (где dob — это дата, о которой идет речь):
var getPotentialDuplicatePatients = function (name, dob) {
return $http({
data: { name: name, dob: dob },
url: "/PatientData/CheckForPotentialPatientDuplicates",
method: 'POST'
});
};
И метод действия в контроллере выглядит следующим образом:
[HttpPost]
public ActionResult CheckForPotentialPatientDuplicates(string name, DateTime dob)
{
var duplicates = Enumerable.Empty<PatientPlusEpCountDto>();
if (//Authorize(WebConstants.EditAction, WebConstants.SurgeonAndDataManagerProtectedResource) amp;amp;
Execute(() => duplicates = _mediator.Send(new GetPotentialPatientDuplicatesQuery
{
DateOfBirth = dob,
PatientName = name
})))
{
return JsonNet(duplicates);
}
return JsonError(Errors);
}
Еще одним интересным аспектом всего этого является то, что свойства даты и времени сложных объектов не страдают от той же неудачи. Выше вы можете видеть, что параметр является собственным типом. Там, где публикуется сложный тип, который включает свойства даты и времени, все работает так, как ожидалось.
Время дня отличается между ними. В исходном исходном DateTime оно включает время суток (даже если объект JSON равен 12:00 утра). В сложном типе это 12:00, как и ожидалось.
Запустив это, я попробую обернуть полезную нагрузку в сложный объект (который я создам) и посмотрю, решит ли это проблему.
Обновление — Временное разрешение
Мне пришлось написать следующий ужасный хак, чтобы заставить это работать должным образом:
var transformDob = new DateTime(dob.Ticks, DateTimeKind.Utc).ToLocalTime();
var dateOfBirth = transformDob.Date;
И я удалил код, который изменяет прототип даты. Теперь запросы json возвращаются к UTC. Необходимо проверить, работает ли он по-прежнему с другими частями приложения.
Комментарии:
1. Было бы здорово (т. е. Необходимо), чтобы вы показали код на обоих концах процесса, чтобы мы могли проверить поведение и протестировать решение.
2. Сначала проверьте, соответствует ли ваше дата-время. При десериализации для вида установлено значение местного времени, в противном случае используйте
DateTimeOffset
структуру в качестве альтернативы (см. Ссылку на MSDN: msdn.microsoft.com/en-us/library /… ). Чтобы прояснить это, я предпочитаю включить ваш код десериализации в вопрос.3. @TetsuyaYamamoto я не выполняю десериализацию. .NET Framework является. Рассматриваемое время даты является параметром метода действия в контроллере. Приветствия.
4. @Enigmativity Я отредактирую вопрос с помощью некоторого кода. Писать будет не так много, поскольку десериализация выполняется фреймворком MVC.
5. Возможно, вместо этого использовать DateTimeOffset? msdn.microsoft.com/en-us/library /. …