Здравствуйте, у меня есть 2 переменные типа int, которые я хотел бы связать со значениями min и maxinput типа time.
Как я могу это сделать?
Я не знаю, что разместить в поле bind, так как там 2 разные переменные.
Также есть атрибуты min и max.
<input type = "time" min = "@model.min" max = "@model.max" bind=?/>
Что мне поставить в bind?
Обновлять
После более тщательного анализа я решил, что мне понадобятся 2 переменные типа Timespan, и я привяжу их к 2 входам типа time.
У меня есть 2 поля типа Timespan, и мне нужно как-то ограничить пользователя интервалом [ from hour - to Hour] ... например, [ 13.00 17.00]





Вы не можете напрямую привязать TimeSpan к входным данным в Blazor, но вы можете использовать свойство для преобразования его в строку или из нее.
<input type = "time" min = "@model.min" max = "@model.max" bind = "@TimeProxy" />
и
@functions
{
string TimeProxy { get => model.Time.ToString(); set => TimeSpan.TryParse(value,out model.Time); }
}
Предыдущее решение не работало для меня с .net Core 3.1, поэтому я добавлю обновленное:
Используйте Блазор:
<EditForm Model=@model OnValidSubmit = "Submit">
<InputText type = "time" @bind-Value = "TimeProxy" />
</EditForm>
Также необходимы изменения в коде.
@code {
// This field is required as you can not use property in out statement
private TimeSpan LocalTime = TimeSpan.FromHours(0);
private string TimeProxy {
get => model.Time.ToString();
set => TimeSpan.TryParse(value,out LocalTime);
}
private void Submit() {
model.Time = LocalTime;
// following submit logic...
}
}
Я написал для этого небольшой компонент, который использует привязку данных и работает с соответствующими типами данных.
использование:
<LabeledTime @bind-Value = "shutdownDelay"></LabeledTime>
компонент:
<label class = "form-label" for = "@LabelId">
@ChildContent
</label>
<input id = "@LabelId" type = "time" value = "@ValueInternal.ToString("hh\\:mm")" step = "60" @onchange = "InternalValueChanged"/>
@code {
private long LabelId = DateTime.Now.Ticks;
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public TimeSpan Value { get; set; }
[Parameter]
public EventCallback<TimeSpan> ValueChanged { get; set; }
private TimeSpan ValueInternal { get; set; }
protected override void OnParametersSet()
{
ValueInternal = Value;
base.OnParametersSet();
}
private void InternalValueChanged(ChangeEventArgs obj)
{
if (!TimeSpan.TryParseExact(obj.Value.ToString(), "hh\\:mm\\:ss", null, out var result))
return;
ValueInternal = result;
Value = result;
ValueChanged.InvokeAsync(result);
}
}
Я использовал это и изменил его для работы с новым типом .net 6 TimeOnly. Отлично сработало спасибо.
Вы также можете сделать следующее:
<input type = "time" @bind = "SomeTime" @bind:format = "HH:mm"/>
@code {
public DateTime SomeTime = new DateTime();
private TimeSpan _time = SomeTime.TimeOfDay;
}
Пожалуйста, не привязывайтесь к TimeSpan напрямую!
У вас есть поле в вашей модели на время?