Blazor Server中Razor调用页面实例方法报null 'this'异常排查
问题原因及解决方法
你遇到的错误本质是两个问题:
UpdateMainDwg是CrackWidth类的私有方法,外部组件Layout2无权直接调用私有成员- 你定义的
UpdateInputSVG参数未被父组件正确赋值,它的值为null,调用实例方法时自然会抛出"Delegate to an instance method cannot have null 'this'"错误
方案一:修改方法权限并确保参数正确传递
- 调整CrackWidth中方法的访问权限,将私有改为公共:
namespace Concrete.CrackWidth.Pages { public partial class CrackWidth { // 把private改为public,允许外部组件访问 public void UpdateMainDwg() { } } }
- 在引用Layout2.razor的父组件(通常是CrackWidth.razor)中,正确传递
UpdateInputSVG参数:
<Layout2 InputModel="@InputModel" InputValidator="@InputValidator" UpdateInputSVG="this" />
这样UpdateInputSVG会获取到CrackWidth的有效实例,同时因方法改为公共权限,就能正常调用了。
方案二:用EventCallback实现组件解耦(推荐)
这种方式无需直接引用CrackWidth实例,更符合Blazor组件通信的最佳实践:
- 修改Layout2.razor代码,替换参数为EventCallback:
<MudTextField @bind-Value="InputModel.fyk" Validation="@(InputValidator.ValidateValue)" For="@(() => InputModel.fyk)" TextChanged="TriggerTextChanged" Immediate="true" Label="Rebar tensile strength [N/mm^2]" Placeholder="Tensile strength in N/mm^2" /> @code { [Parameter] public Ec2InputModel InputModel { get; set; } [Parameter] public Ec2InputValidator InputValidator { get; set; } // 定义事件回调,替代直接引用组件实例 [Parameter] public EventCallback<string> OnTextChanged { get; set; } private async Task TriggerTextChanged(string value) { await OnTextChanged.InvokeAsync(value); } }
- 在CrackWidth.razor中使用Layout2时,绑定回调到
UpdateMainDwg方法:
<Layout2 InputModel="@InputModel" InputValidator="@InputValidator" OnTextChanged="@(args => UpdateMainDwg())" />
这样当MudTextField文本变化时,会触发回调调用CrackWidth内的UpdateMainDwg方法,无需修改原方法的私有权限,也避免了实例为null的问题。
内容的提问来源于stack exchange,提问作者ste4lth
相关产品推荐
相关产品推荐

