Blazor动态组件渲染报错:混合含/不含可选参数的组件
解决Blazor DynamicComponent混合组件传参的空引用问题
核心问题原因
当给不包含OnInputCallBack参数的组件传递该参数时,DynamicComponent会因参数不匹配引发空引用或参数绑定错误。以下是三种可行的解决方式:
方案一:反射检查组件参数后选择性传参
通过反射判断当前组件类型是否包含目标参数,仅向存在该参数的组件传递对应参数集合:
@foreach (var item in BaseParameters) { var componentParams = HasParameter(item, "OnInputCallBack") ? parameters : new Dictionary<string, object>(); <DynamicComponent Type="@item" Parameters="componentParams" /> } @code { public List<Type> BaseParameters { get; set; } = new List<Type>(new[] { typeof(MyComponent1), typeof(MyComponent2) }); Dictionary<string, object>? parameters = new() { { "OnInputCallBack", EventCallback.Factory.Create<EventCallbackArgs>(this, GetChangedValue) } }; private bool HasParameter(Type componentType, string parameterName) { var properties = componentType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); return properties.Any(p => p.Name == parameterName); } private void GetChangedValue(EventCallbackArgs args) { // 处理回调逻辑 } }
方案二:为不同组件单独定义参数集合
针对不同组件类型生成专属的参数字典,避免共用参数导致不匹配:
@foreach (var item in BaseParameters) { <DynamicComponent Type="@item" Parameters="GetComponentParameters(item)" /> } @code { public List<Type> BaseParameters { get; set; } = new List<Type>(new[] { typeof(MyComponent1), typeof(MyComponent2) }); private Dictionary<string, object> GetComponentParameters(Type componentType) { var paramsDict = new Dictionary<string, object>(); if (componentType == typeof(MyComponent2)) { paramsDict.Add("OnInputCallBack", EventCallback.Factory.Create<EventCallbackArgs>(this, GetChangedValue)); } // 其他组件可按需添加对应参数 return paramsDict; } private void GetChangedValue(EventCallbackArgs args) { // 处理回调逻辑 } }
方案三:通过接口规范组件参数
定义统一接口规范需要回调的组件,通过类型判断实现精准传参:
首先定义接口:
public interface IHasInputCallback { EventCallback<EventCallbackArgs> OnInputCallBack { get; set; } }
让需要回调的组件实现该接口:
@implements IHasInputCallback <!-- 组件内容 --> @code { [Parameter] public EventCallback<EventCallbackArgs> OnInputCallBack { get; set; } }
最后修改MainLayout代码:
@foreach (var item in BaseParameters) { var componentParams = new Dictionary<string, object>(); if (typeof(IHasInputCallback).IsAssignableFrom(item)) { componentParams.Add("OnInputCallBack", EventCallback.Factory.Create<EventCallbackArgs>(this, GetChangedValue)); } <DynamicComponent Type="@item" Parameters="componentParams" /> } @code { public List<Type> BaseParameters { get; set; } = new List<Type>(new[] { typeof(MyComponent1), typeof(MyComponent2) }); private void GetChangedValue(EventCallbackArgs args) { // 处理回调逻辑 } }
内容的提问来源于stack exchange,提问作者Akshay Pradeep-Kulkarni
相关产品推荐
相关产品推荐

