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-Value
etc。但一切都无济于事。
这是什么原因造成的?
【问题讨论】:
编译时错误也不例外。 好点@HenkHolterman,我已经相应地修正了标题。 【参考方案1】:事实证明,至少有两个原因:
1。组件名称现在区分大小写
答案原来是 blazor 组件的命名现在区分大小写,我在“TelerikDropdownList”中缺少一个大写字母,应该是 TelerikDropDownList。
使用区分大小写名称的更改是documented here,并且还在here 和官方文档here 中进行了讨论。这个想法是为了减少误导性信息,但结果是引入了另一个信息,所以我提出了an issue for that on the AspNetCore repo。
2。您忘记了组件命名空间的 @using
语句
如果您忘记或删除了组件命名空间的@using
语句,您也会收到同样的错误。如果您使用的是 ReSharper,这很容易做到,因为它目前将它们标记为未使用并提供删除它们。
检查是否是这个问题
检查编译器是否将您的组件正确识别为 Blazor 组件而不是 html 标记的一个好方法是检查关键字的颜色编码。如果一切正常,它们将是相同的颜色(下例中为绿色):
如果名称或命名空间有误,您会看到混合颜色(请注意,Data
和 ValueField
现在与 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 页面而不导致页面刷新