【问题标题】:Why does value="string-value" work with input type="time", but not bind-value="string-value"为什么 value="string-value" 可以与 input type="time" 一起使用,而不是 bind-value="string-value"
【发布时间】:2020-04-26 22:50:14
【问题描述】:

我正在开发一个简单的网站来试用一些 Blazor(我是新手)。我创建了一个带有字符串值“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";
}

这会生成错误“无法从 'string' 转换为 'System.DateTime'”。但是,当我删除绑定并按以下方式创建输入时:它工作正常。

<input value="08:00" class="col-sm-1" type="time"/>

任何想法为什么会有所不同?使用 DateTime 对我来说没有意义,如果我可以使用 TimeSpan,我会同意,但这也不起作用。

【问题讨论】:

  • 你试过用bind代替bind-value吗?
  • 似乎返回同样的错误。

标签: c# html blazor


【解决方案1】:

使用@bind-value,您将绑定到一个字符串类型,它不适用于type="time"。

使用value,您输入了正确的“时间”类型,而不是字符串。 当你输入一个像'foo'这样的字符串时,它就不起作用了。

【讨论】:

  • 谢谢@Inktkiller。但是当我发布值时,类型似乎是完整的 DateTime 。如果我要更改我的代码并为我的绑定值提供完整的 DateTime。你知道什么是最好的做法吗?我应该在我的时间点之前输入 DateTime.Now(因为输入不只接受一个 TimePoint)吗?
【解决方案2】:

我尝试使用 TimeSpan 输入类型 time 并得到以下编译错误: Error CS1503 Argument 1: cannot convert from 'System.TimeSpan' to 'System.DateTime'

Blazor 将某些类型的 &lt;input /&gt; 映射到某些类型的 CLR 类型。 这样做的原因可能是为了减少不需要的类型和转换错误、遗漏行为 (?)。

在 Blazor 的官方文档中,这是在“片段”中提到的:

渲染组件时,输入元素的值来自 CurrentValue 属性。当用户在文本框中键入并更改元素焦点时,将触发 onchange 事件并将 CurrentValue 属性设置为更改后的值。 实际上,代码生成更复杂,因为@bind 处理执行类型转换的情况。 原则上,@bind 将表达式的当前值与值属性相关联,并使用注册的处理程序处理更改.

Link to the doc

您可以使用DateTime 并提供如下格式器:

<input @bind="StartDate" @bind:format="yyyy-MM-dd" />

@code {
    [Parameter]
    public DateTime StartDate { get; set; } = new DateTime(2020, 1, 1);
}

【讨论】:

  • 嗨,谢谢@Zsolt!我按照您的建议使用 DateTime 属性解决了它。 Blazor 要求正确的类型可能是一件好事。在我只想使用时间而不是日期的情况下,我发现我必须使用 DateTime 很奇怪。我宁愿只使用 TimeSpan 。但是,问题解决了,我必须学习一两件事!所以我很高兴也很感激。
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多