如何在blazor中强制重新渲染RenderFragment?

时间:2019-12-12 13:05:07

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

问题

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

我尝试了什么

我使用函数ViewProvider创建了一个名为Edit(T current)的帮助程序类,其中T是代表我的记录的类。编辑函数返回RenderFragment

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

问题

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

编辑:

代码如下:

Grid.razor

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

0 个答案:

没有答案