首页 > 解决方案 > 如何在 blazor 中强制重新渲染 RenderFragment?

问题描述

问题

我在 Blazor 中做一个模态组件来编辑网格的记录。如果用户单击我的按钮,我想用当前选择的记录呈现它。

我试过什么

ViewProvider我用一个函数调用了一个辅助类,Edit(T current)其中T一个代表我的记录的类。编辑函数返回RenderFragment

然后,我将其放置@ViewProvider.Edit(Current)Grid.razor我打算显示模态窗口的位置。每次网格更改其状态时都会调用它。但是,模式将仅弹出一次,并且在单击按钮后不会以新记录重新呈现。我想 Blazor 在它的树内部看到我的模态并且认为没有任何改变,因为视图是相同的(尽管视图中的数据不同)。

问题

每次单击按钮时,如何强制我的模态显示当前记录?或者如何更改 RenderFragment 的一部分以更新视图中的数据?

编辑:

这是代码:

网格剃须刀

@if (EditedCell.HasValue) {
    @ViewProvider.Edit(Current, "Edit")
}

ViewProvider.cs

public override RenderFragment Edit(T current, string modalName)
{
            RenderFragment editView = (builder) =>
            {
                foreach (var property in typeof(T).GetProperties())
                {
                    builder.OpenElement(0, "div");
                    builder.AddAttribute(1, "class", "mt10 mb10");
                    builder.OpenElement(2, "label");
                    builder.AddContent(3, property.Name);
                    builder.CloseElement();
                    builder.OpenComponent<InputBox>(4);
                    builder.AddAttribute(5, "Type", InputBox.SetInputType(property.PropertyType));
                    builder.AddAttribute(6, "Value", property.GetValue(current).ToString());
                    builder.AddAttribute(7, "Class", "right");
                    builder.CloseComponent();
                    builder.CloseElement();
                }
                builder.OpenElement(8, "button");
                builder.AddAttribute(9, "class", "primary");
                builder.AddAttribute(10, "onclick", EventCallback.Factory.Create<MouseEventArgs>(this, s => { EditOnClick(current, s); }));
                builder.AddContent(11, "Zapisz");
                builder.CloseElement();
            };
            return AddModal(editView, modalName);
}

public RenderFragment AddModal(RenderFragment ChildContent, string modalName)
{
            RenderFragment modalFragment = (builder) =>
            {
                builder.OpenComponent<Modal>(0);
                builder.AddAttribute(1, "Name", modalName);
                builder.AddAttribute(2, "ChildContent", ChildContent);
                builder.CloseComponent();
            };
            return modalFragment;
}

标签: c#asp.net-core.net-coreblazor

解决方案


推荐阅读