Blazor 中的“无法从绑定属性‘绑定值’推断属性名称”错误

Posted

技术标签:

【中文标题】Blazor 中的“无法从绑定属性‘绑定值’推断属性名称”错误【英文标题】:"The attribute names could not be inferred from bind attribute 'bind-value'" error in Blazor 【发布时间】:2019-08-16 17:33:40 【问题描述】:

我刚刚将 Blazor 项目从 Core 3 Preview 6 迁移到 Preview 8,我现在收到此错误:

无法从绑定属性推断属性名称 '绑定值'。绑定属性的形式应为“绑定”或 “绑定值”及其相应的可选参数,如 'bind-value:event'、'bind:format' 等

我已经隔离了导致这种情况发生的组件,并且代码当然似乎是 bind-value 按照错误消息中的说明设置的:

      <TelerikDropdownList Data="@State.ContainerSizes" 
                           ValueField=@nameof(ContainerSize.ContainerSizeId)
                           TextField=@nameof(ContainerSize.ContainerSizeName)
                           @bind-Value="@ContainerSizeIdNoNull"
                           >
      </TelerikDropdownList>

我尝试从@bind-Value 中删除@ 并更改大写@bind-Valueetc。但一切都无济于事。

这是什么原因造成的?

【问题讨论】:

编译时错误也不例外。 好点@HenkHolterman,我已经相应地修正了标题。 【参考方案1】:

事实证明,至少有两个原因:

1。组件名称现在区分大小写

答案原来是 blazor 组件的命名现在区分大小写,我在“TelerikDropdownList”中缺少一个大写字母,应该是 TelerikDropDownList。

使用区分大小写名称的更改是documented here,并且还在here 和官方文档here 中进行了讨论。这个想法是为了减少误导性信息,但结果是引入了另一个信息,所以我提出了an issue for that on the AspNetCore repo。

2。您忘记了组件命名空间的 @using 语句

如果您忘记或删除了组件命名空间的@using 语句,您也会收到同样的错误。如果您使用的是 ReSharper,这很容易做到,因为它目前将它们标记为未使用并提供删除它们。

检查是否是这个问题

检查编译器是否将您的组件正确识别为 Blazor 组件而不是 html 标记的一个好方法是检查关键字的颜色编码。如果一切正常,它们将是相同的颜色(下例中为绿色):

如果名称或命名空间有误,您会看到混合颜色(请注意,DataValueField 现在与 TelerikDropdownList 的颜色不同):

【讨论】:

另外,我认为您可能需要将:@bind-Value="@ContainerSizeIdNoNull" 更改为:@bind-Value="ContainerSizeIdNoNull" 缺少使用是我的罪魁祸首 区分大小写!哎哟! 如果您拼错了组件名称,也可能发生这种情况!谢谢你的提示。它让我找到了正确的解决方案。【参考方案2】:

“无法从 Blazor 中的绑定属性 'bind-value' 推断属性名称”异常

我也遇到过类似的问题,但解决方案相当简单,而不是直观!

最后,我发现添加所用组件的缺失 using 语句很有帮助的信息。我也是。而且它奏效了!

尽管组件名称显示为绿色(就像它被识别一样),但它不是。只有缺少使用解决了问题。这是一种误导行为。

因此,如果您遇到同样的问题,请检查您是否缺少实际组件的“使用”即使组件的名称显示为绿色。

【讨论】:

【参考方案3】:

就我而言,我有以下参数:

[Parameter]
public string[] BindingValue  get; set; 

[Parameter]
public EventCallback<string[]> BindingValueChanged  get; set; 

还有绑定:

<MultiselectDropdownComponent 
@bind-BindingValue="SessionState.MyArray" />

产生了与主题相同的错误。我还指定了using 语句..

来自 MS 文档: https://docs.microsoft.com/en-us/aspnet/core/blazor/components/data-binding?view=aspnetcore-5.0#binding-with-component-parameters

<Child @bind-Year="year" />

Year 参数是可绑定的,因为它有一个与 Year 参数类型匹配的伴随 YearChanged 事件。

按照惯例,可以通过包含分配给处理程序的@bind-PROPERTY:event 属性来将属性绑定到相应的事件处理程序。 相当于写:

<Child @bind-Year="year" @bind-Year:event="YearChanged" />

所以我决定明确指定event,它奏效了!

<MultiselectDropdownComponent 
@bind-BindingValue="SessionState.MyArray"
@bind-BindingValue:event="BindingValueChanged" />

编辑:使用Blazor WASM 和.Net 5

【讨论】:

太棒了!这对我有用。上面的其他一切都很好(使用大写字母),但我一直收到这条消息。取决于隐式行为。【参考方案4】:

我可以添加另一个 - 不明显的陷阱(至少对我而言)。

完全限定组件,然后依靠 using 语句来识别属性不起作用。这是由智能感知添加的。

不工作的例子:

@using WebUI.Components.Modals
<WebUI.Components.Modals.WebUI.Components.Modals.AssetModal @bind-IsVisible="_assetDialogVisible" Asset="_selectedAsset"></WebUI.Components.Modals.WebUI.Components.Modals.AssetModal>

工作版本:

@using WebUI.Components.Modals
<AssetModal @bind-IsVisible="_assetDialogVisible" Asset="_selectedAsset"></AssetModal>

【讨论】:

以上是关于Blazor 中的“无法从绑定属性‘绑定值’推断属性名称”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从服务器端 Blazor 应用程序中的 Blazor 组件调用 razor 页面而不导致页面刷新

身份剃须刀页面中的 Blazor 组件

Blazor 中的递归标记

Blazor 中的状态管理选项

从 Blazor 中的页面组件调用 MainLayout 中的方法

获取 Blazor 组件中的当前 URL