如何在MudBlazor子对话框中结合自定义类使用[CascadingParameter]
问题解决:Blazor/MudBlazor对话框传递自定义类参数失败
错误原因
报错提示明确指出:子组件RiverDingoInvoiceEdit的DataBlazor属性未标记[Parameter]、[CascadingParameter]等参数特性,Blazor无法识别该属性为可接收外部传入的参数,导致参数传递失败。
修复步骤
1. 修正子组件的参数标记
修改RiverDingoInvoiceEdit.razor.cs,给DataBlazor属性添加[Parameter]特性,并设置为公共属性(Blazor组件参数必须为public):
public partial class RiverDingoInvoiceEdit { // 添加[Parameter]特性,改为public [Parameter] public rMidiDataBlazor DataBlazor { get; set; } [CascadingParameter] IMudDialogInstance MudDialog { get; set; } // 可选:初始化时做空值检查,避免空引用异常 protected override void OnInitialized() { // 若父组件未传值,初始化一个空实例 DataBlazor ??= new rMidiDataBlazor(); } }
2. (可选)避免直接修改父组件原数据
rMidiDataBlazor是引用类型,父组件传递的是对象引用,子组件修改DataBlazor的属性会直接影响父组件的原对象。如果需要实现「取消编辑不保留修改」的逻辑,可利用你的ShallowCopy方法创建本地副本:
public partial class RiverDingoInvoiceEdit { private rMidiDataBlazor _localData; [Parameter] public rMidiDataBlazor DataBlazor { get; set; } [CascadingParameter] IMudDialogInstance MudDialog { get; set; } protected override void OnInitialized() { // 创建本地副本,修改不会影响原对象 _localData = DataBlazor?.ShallowCopy() ?? new rMidiDataBlazor(); } private void Submit() { // 提交时将本地副本返回给父组件 MudDialog.Close(DialogResult.Ok(_localData)); } private void Cancel() { MudDialog.Cancel(); } }
同时修改子组件razor文件中的绑定对象为_localData:
<MudTextField T="string" Label="Invoice Title:" @bind-Value="_localData.Field2" Variant="Variant.Text" MaxLength="50" Required="true" RequiredError="You must supply an Invoice Title" /> <MudTextField T="string" Label="Cost:" @bind-Value="_localData.Field4" Variant="Variant.Text" MaxLength="7" Required="true" RequiredError="You must supply an Invoice Cost" Mask="@(new PatternMask("0000.00"))" /> <MudDatePicker Label="Invoice Date" @bind-Value="_localData.Field3" AutoClose="true" /> <MudTextField T="string" Label="Notes:" @bind-Value="_localData.Field5" Variant="Variant.Text" MaxLength="250" Lines="6"></MudTextField>
3. 父组件接收修改后的数据(可选)
如果使用了本地副本,父组件可接收返回的更新数据:
var Result = await DialogReference.Result; if (!Result.Canceled) { var updatedData = Result.Data as rMidiDataBlazor; // 此处可根据updatedData更新数据源 this.GetRiverDingoData(); }
内容的提问来源于stack exchange,提问作者RSullivan
相关产品推荐
相关产品推荐

