You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中如何修改BuildRenderTree让自定义EditForm向子组件级联自身实例

解决方案

你只需要在原有的CascadingValue<EditContext>外层嵌套一层CascadingValue<CustomForm>,将当前组件实例作为值传递即可,修改后的代码如下:

protected override void BuildRenderTree(RenderTreeBuilder builder)
{
    Debug.Assert(EditContext != null);

    // If _editContext changes, tear down and recreate all descendants.
    // This is so we can safely use the IsFixed optimization on CascadingValue,
    // optimizing for the common case where _editContext never changes.
    builder.OpenRegion(EditContext.GetHashCode());

    builder.OpenElement(0, "form");
    builder.AddMultipleAttributes(1, AdditionalAttributes);
    builder.AddAttribute(2, "onsubmit", _handleSubmitDelegate);
    
    // 新增外层级联传递CustomForm自身实例
    builder.OpenComponent<CascadingValue<CustomForm>>(3);
    builder.AddAttribute(4, "IsFixed", true);
    builder.AddAttribute(5, "Value", this);
        // 原有EditContext级联逻辑,序列号对应往后顺延
        builder.AddAttribute(6, "ChildContent", (RenderFragment)(builder2 =>
        {
            builder2.OpenComponent<CascadingValue<EditContext>>(0);
            builder2.AddAttribute(1, "IsFixed", true);
            builder2.AddAttribute(2, "Value", EditContext);
            builder2.AddAttribute(3, "ChildContent", ChildContent?.Invoke(EditContext));
            builder2.CloseComponent();
        }));
    builder.CloseComponent();
    
    builder.CloseElement();
    builder.CloseRegion();
}

注意说明

  • 嵌套的级联值会同时向下传递,既保留了原生EditForm的EditContext级联逻辑,也新增了CustomForm实例的级联传递,子组件可以按你定义的[CascadingParameter] public CustomForm Form { get; set; }正常接收
  • IsFixed设为true是因为CustomForm实例在组件生命周期内不会变更,可以优化渲染性能
  • RenderTree的序列号需要按层级调整,避免同层级序列号重复导致渲染异常

内容的提问来源于stack exchange,提问作者Samo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:01