Конвертировать DateTime? в DateTime
// эти две даты привязаны к календарю,
// по умолчанию сегодня, а потом позже, они берут значение, что выбрал пользователь
// и меняются, все работает и когда меняются значение присваивается
public DateTime? MinDate { get; set; } = DateTime.Now;
public DateTime? MaxDate { get; set; } = DateTime.Now;
// вот таким образом
public async Task ValueChangeHandlerAsync(RangePickerEventArgs<DateTime?> args)
{
if ((args.Date1 != null) && (args.Date2 != null))
{
MinDate = args.Date1;
MaxDate = args.Date2;
}
//And when user UNfocused, i call some function with TWO dates value set
if ((MinDate != null) & (MaxDate != null))
{
// тут я отправляю в LocalStorage две даты, ниже код, заходит сюда, только если обе даты // инитциализированны
}
}
Сохраняю в LocalStorage две даты, и получаю ошибку
The JSON value could not be converted to System.DateTime. Path: $ | LineNumber: 0 | BytePositionInLine: 4.
попыталась конвертировать, нашла в просторах пример ?
DateTime UpdatedTime1 = MinDate ?? DateTime.Now;
DateTime UpdatedTime2 = MaxDate ?? DateTime.Now;
LocalStorageServices.SetSessionDate("date1", UpdatedTime1);
LocalStorageServices.SetSessionDate("date2", UpdatedTime2);
все равно ошибка, так же пыталась сразу DateTime? отправлять
Null object cannot be converted to a value type.
вот метод отправки, я и DateTime и DateTime? пробоавала
public async void SetSessionDate(string title, DateTime? valeur)
{
try
{
await WaitForReference();
await _accessorJsRef.Value.InvokeAsync<DateTime?>("set", title, valeur);
}
catch (Exception ex)
{
Log.WriteLine($"SetSessionDate({title}, {valeur}) : " + ex.Message);
}
}
это js
export function set(key, value) {
window.localStorage.setItem(key, value);
}
так же использовала (это просто интуитивно, но такой функции нету выходит ошибка)
export function setDate(key, value) {
window.localStorage.setDate(key, value);
}
необходимо: две даты сохранить в LocalStorage
- по итогу даты сохраняются, но всегда попадает в
catch(может это норма ?)
Ответы (2 шт):
await _accessorJsRef.Value.InvokeAsync<DateTime?>("set", title, valeur);
здесь <DateTime?> согласно сигнатуре метода - это возвращаемое значение.
public static ValueTask<TValue> InvokeAsync<[DynamicallyAccessedMembers(JsonSerialized)] TValue>(this IJSObjectReference jsObjectReference, string identifier, params object?[]? args)
Но JS метод ничего не возвращает, undefined. А вы пытаетесь это "ничего" в DateTime? конвертировать. Поэтому и исключение.
Можно обратную связь даже добавить
export function set(key, value) {
try {
window.localStorage.setItem(key, value);
return true;
} catch(e) {
return false;
}
}
Тогда вызов может быть такой
bool success = await _accessorJsRef.Value.InvokeAsync<bool>("set", title, valeur);
if (!success)
{
throw new InvalidOperationException("JS скрипт не смог сохранить дату");
}
оставлю свое решение тоже тут :
- чтоб конвертировать можно использовать как и говорила в вопросе :
DateTime MyDate = DateNullable ?? DateTime.Now;
тобразом MyDate можно использовать в формате, где нужно строго не Nullable, но в вашем случае но в моем случае дело не в DateTime?, а то, что в хранилищах как правило хранятся строки...
Чтобы принять во внимание локации, буду хранить число (первое решение, это была строка, но тогда может возникнуть конфликт если часовой пояс другой итд), которое всегда можно конвертировать в дату.
@page "/"
<button @onclick=GetMyDate></button>
@if (MyDateFromLocalStorage != null)
{
<p>@MyDateFromLocalStorage</p>
<p>@textForDate</p>
}
@code {
DateTime? MyDate = DateTime.Now;
DateTime? MyDateFromLocalStorage = DateTime.Now.AddDays(-1);
string textForDate = "дата по умолчанию присвоена вчера(шняя)";
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await LocalStorageService.SetSessionString("myDate", MyDate?.Ticks.ToString());
}
async Task GetMyDate()
{
var numberOfTicks = await LocalStorageService.GetSessionStringAsync<string>("myDate");
DateTime myDate = new DateTime(long.Parse(numberOfTicks));
MyDateFromLocalStorage = myDate;
textForDate = "дату взяли из хранилища";
StateHasChanged();
}
}
