我有一个Blazor项目,它加载包含Razor组件的DLL。为了在客户端呈现这些动态组件,我使用渲染树构建器从动态组件创建
RenderFragment
,并将其放置在页面上以显示组件。但是,在创建渲染树时,我找不到一种绑定值的方法。通常情况下,我可以使用下面父子组件的示例传递数据,但不确定如何在将动态组件转换为RenderFragment
时执行此操作。
父组件
@page "/ParentComponent"
<h1>Parent Component</h1>
<ChildComponent @bind-Password="_password" />
@code {
private string _password;
}
子组件
<h1>Child Component</h1>
Password:
<input @oninput="OnPasswordChanged"
required
type="@(_showPassword ? "text" : "password")"
value="@Password" />
<button class="btn btn-primary" @onclick="ToggleShowPassword">
Show password
</button>
@code {
private bool _showPassword;
[Parameter]
public string Password { get; set; }
[Parameter]
public EventCallback<string> PasswordChanged { get; set; }
private Task OnPasswordChanged(ChangeEventArgs e)
{
Password = e.Value.ToString();
return PasswordChanged.InvokeAsync(Password);
}
private void ToggleShowPassword()
{
_showPassword = !_showPassword;
}
}
渲染片段转换为动态组件
下面的代码演示了如何通过将动态组件转换为RenderFragment
在页面上显示该组件。请问如何在渲染树构建器中绑定一个变量,以从动态组件传递数据到父页面?
注意:这个动态组件@dynamicComponent
与上面的子组件相同,我想要它的密码数据。
@page "/{ComponentName}"
@inject IComponentService ComponentService
@if (render)
{
@dynamicComponent()
@_password;
}
@code{
private string _password;
[Parameter]
public string ComponentName { get; set; }
bool render = false;
protected override void OnInitialized()
{
render = true;
base.OnInitialized();
}
RenderFragment dynamicComponent() => builder =>
{
RazorComponentModel component = ComponentService.GetComponentByPage(ComponentName);
builder.OpenComponent(0, component.Component);
for (int i = 0; i < component.Parameters.Count; i++)
{
var attribute = component.Parameters.ElementAt(i);
builder.AddAttribute(i + 1, attribute.Key, attribute.Value);
}
builder.CloseComponent();
};
}
PluginData
,它有一个名为_password
的字符串属性,我该如何修改你上面的解决方案来实现呢? - Ibrahim Timimi