Blazor 数据绑定到 javascript 具有来自 C# 的复杂对象的 Web 组件

Blazor databinding to a javascript web component with complex object from C#

我有一个引用自定义 Web 组件 (<omnibar-navigation>) 的 Blazor 应用。

此组件有一个项目 属性,它应该是一个 json 对象,看起来像这样:

[{'title':'Home','icon':'places-home-1','url':'/','metadata':null,'items':null}, ...]

我想知道如何将 C# 复杂对象绑定到 items 属性。

var options = new List<Nav> { new Nav { Title = "Home", Icon = "places-home-1", Url = "/" } };

那么绑定将是这样的(不起作用):

<omnibar-navigation items="@options">...</omnibar-navigation>

此问题的代码库位于:https://github.com/dahlsailrunner/blazor-oidc

有确切问题的页面在这里:https://github.com/dahlsailrunner/blazor-oidc/blob/master/Sample.Blazor/Pages/Stencil.razor

组件导入到 Pages/_Host.cshtml 文件中。

您将构建一个组件,其参数 属性 接收您的 Nav 类型的 IEnumerable。您只需要反序列化您的 JSON 并将其绑定到该集合。

查看此要点以了解如何反序列化 JSON 并绑定到 index.razor 文件中的集合

https://gist.github.com/csharpfritz/c4dcfcc731826822e0764728bbd9d88c

好问题。我还注意到通过 Blazor 数据绑定直接绑定 Web 组件的一些问题,尤其是 Web 组件的 connectedCallback which is a kwown issue

但最棒的是:

如果 Blazor 中的某些内容无法正常工作,您可以随时使用 JavaScript Interop 使其正常工作!

我在这里为您创建了一个博客 post,展示了如何通过 JS Interop 集成 Web 组件,该组件具有这样一个 property/attribute 需要一个复杂的对象:https://www.thomasclaudiushuber.com/2020/02/14/initializing-web-components-in-blazor-via-js-interop/

它还展示了如何使用本机 Blazor 组件包装 Web 组件,以便您可以仅使用 C# 将其绑定。 :-)

这是一个包含所有代码的 git 存储库:https://github.com/thomasclaudiushuber/Blazor-Using-Custom-Web-Component

编码愉快, 托马斯