我正在一个简单的网站上尝试一些Blazer(我是菜鸟(。我创建了一个字符串值为"08:00"的绑定,并将 i 绑定到输入字段,如下所示:
<input @bind-value="@StartValue" @bind-value:event="onchange" class="col-sm-1" type="time"/>
@code {
public string StartValue { get; set; } = "08:00";
}
这将生成错误"无法从'字符串'转换为'系统.日期时间'"。但是,当我删除绑定并创建我的输入时,如下所示:它工作正常。
<input value="08:00" class="col-sm-1" type="time"/>
有什么不同吗?使用日期时间对我来说没有意义,如果我可以使用 TimeSpan,我会同意,但这也不起作用。
使用@bind-value
时,您将绑定到字符串类型,该字符串类型不适用于 type="time"。
使用value
,您输入了正确的类型"time",而不是字符串。 当您输入像"foo"这样的字符串时,它将不起作用。
我尝试使用TimeSpan输入类型time,并得到以下编译错误:Error CS1503 Argument 1: cannot convert from 'System.TimeSpan' to 'System.DateTime'
Blazor 将某些类型的<input />
映射到某些类型的 CLR 类型。 这样做的原因可能是减少不需要的类型和转换错误,错过行为(?(。
在 Blazor 的官方文档中,这在"片段"中被提及,例如:
呈现组件时,输入元素的值来自 CurrentValue 属性。当用户在文本框中键入内容并更改元素焦点时,将触发 onchange 事件,并将 CurrentValue 属性设置为更改的值。实际上,代码生成更为复杂,因为@bind处理执行类型转换的情况。原则上,@bind 将表达式的当前值与 value 属性相关联,并使用注册的处理程序处理更改。
链接到文档
您可以使用DateTime
并提供格式化器,如下所示:
<input @bind="StartDate" @bind:format="yyyy-MM-dd" />
@code {
[Parameter]
public DateTime StartDate { get; set; } = new DateTime(2020, 1, 1);
}