在 Blazor 中出现了“无法从绑定属性'bind-value'中推断出属性名称”的错误。

43

我刚刚将一个 Blazor 项目从 Core 3 Preview 6 迁移到 Preview 8,现在出现了以下错误:

无法从绑定属性“bind-value”推断出属性名称。绑定属性应该采用“bind”或“bind-value”的形式,以及它们对应的可选参数,如“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中删除@并更改其大写,但都没有成功。

是什么导致了这个问题?


编译时错误不是异常。 - H H
很好的意见@HenkHolterman,我已经相应地修正了标题。 - tomRedox
我想知道你是否已经弄清楚了何时使用小写值和大写值的情况。我对此仍然感到困惑,可能要开一个提问。 - kanayt
@kanayt,恐怕不行。我现在做的编程工作不多,所以对此没有答案。 - tomRedox
12个回答

82

原来这有至少两个原因:

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

答案是,Blazor组件的命名现在区分大小写,我在'TelerikDropdownList'中缺少了一个大写字母,正确应该是TelerikDropDownList。

关于使用区分大小写的名称的更改,在这里有记录,也在这里和官方文档这里讨论。它的目的是减少误导性消息,但却引入了另一种消息,所以我在AspNetCore repo上提出了问题。

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

如果您忘记或删除了组件命名空间的@using语句,则也会收到相同的错误提示。如果您正在使用ReSharper,则很容易出现这种情况,因为ReSharper当前将其标记为未使用并提供删除选项。

检查是否是这个问题

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

enter image description here

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

enter image description here


我认为你可能需要更改:@bind-Value="@ContainerSizeIdNoNull" 为:@bind-Value="ContainerSizeIdNoNull"。 - Michael Washington
7
对我来说,缺失使用是罪魁祸首。 - Mike S.
1
大小写敏感!哎呀! - Taylor C. White
如果您拼错了组件名称,也可能会发生这种情况!感谢您的提示。它让我找到了正确的解决方案。 - Mmm
由于某些原因,其他东西未定义,导致我出现了这个错误。修复了另一个问题,也解决了这个问题。 - Joost00719

23

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

我遇到了类似的问题,但解决方案比较简单而不是直观!

最后我发现添加一个缺失的组件 using 语句是有帮助的。我也这样做了。然后它就起作用了!

尽管组件名称显示为 绿色(表示已识别),但实际上并非如此。只有缺失的 using 才能解决问题。这是一种 误导性 行为。

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


8
在我的情况下,我有以下参数:
[Parameter]
public string[] BindingValue { get; set; }

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

还有绑定:

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

产生了与主题中相同的错误。我也指定了一个using语句。
来自微软文档: https://learn.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" /> 等同于编写:

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

所以我决定明确指定事件,结果它起作用了!

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

编辑:使用Blazor WASM和 .Net 5


太棒了!这对我起作用了。上面的所有内容都很好(使用大写字母),但我一直收到这个消息。这就是依赖隐式行为的结果。 - John White
这对我也解决了问题...不过,我是从 .net 5 迁移到 .net 6 - 在 .net 5 中一切都正常工作,但一旦迁移到六,我就会收到上面的错误消息。现在,我已经像 @alex 的答案一样,在每个组件使用中添加了 "Changed" 事件的显式引用,并且问题已经解决了。 - Jim

4

补充一下,最近我在为Blazor项目编写Razor组件库时遇到了这个错误。导致我出现这个错误的原因是我的库中的_Imports.razor文件缺少@using Microsoft.AspNetCore.Components.Forms

不幸的是,这个错误信息太笼统了,我花了相当长的时间才找到它。更好的错误报告将使这个过程变得更容易。

如果你和我做类似的事情,遇到了这个问题,希望这能帮到你!


谢谢!我刚开始学习Blazor。它不一定要放在_Important.razor文件中,也可以直接添加到你想使用的组件中。如果你希望将其作为全局引用,我猜你可以将它添加到_Imports.razor文件中。 - Mikael Puusaari

2

我将 @bind-Value 改为 @bind-value(小写)后,它就可以工作了。


1

我在一个代码库中遇到了这个问题,这个代码库我已经积极开发了6个月。Netcore 7、Telerik UI 4.1、ServiceStack 6.7等。我尝试了@tomRedox的解决方案,结果它已经存在了。我将其注释掉后,所有的Cannot convert source type 'Microsoft.AspNetCore.Components.ElementReference'错误都消失了。但我认为最终我的所有问题的根本原因是有一个组件的名称与文件名称不匹配。

我使用了CustomerSearch而不是CustomerSearchComp。之后我的绑定值错误消失了。


1

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

完全限定组件,然后依赖使用语句来识别属性是行不通的。这是由智能感知添加的。

不工作的例子:

@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>

0
在所有解决方案中搜索组件名称,并检查组件项目文件是否有组件的排除标签(就像我的情况一样),然后将其移除。 如果您对所有文件进行了注释然后取消注释,可能会发生这种情况。

0

我导入了这个库:

@using Syncfusion.Blazor.DropDowns

0

我遇到这个问题是因为我在早上编码得太早了。

我不小心将我的<InputText>重命名,所以请确保元素的名称正确。我在执行查找和替换时不小心将其命名为类似<InputDescription>的东西,但实际上该元素并不存在。

在我看来,HTML显示的错误信息可以再好一些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接