在 Blazor 中传递简单参数(以前称为 TempData)Simple Parameter Passing in Blazor (previously TempData)

Simple Parameter Passing in Blazor (Previously TempData)

提问人:ExecChef 提问时间:3/15/2023 最后编辑:ExecChef 更新时间:3/16/2023 访问量:369

问:

我对 Blazor 非常陌生(来自中等水平的 asp.net 经验)。

以前,我使用 ViewBag 和 TempData 将变量从一个组件传递到另一个组件,非常有效且容易。这在 Blazor 中是不可用的,我正在努力了解如何将变量传递给另一个组件。我确实阅读了许多帖子和在线资源。但它们对我来说似乎没有意义,因为我想做的事情。

我试图举一个非常简单的例子来说明我试图完成的事情:

加载 NewEntry.razor 页面时,我需要为新记录条目创建一个新的 GUID (newID)。

[Parameter]
public Guid NewRecord {get; set;} = Guid.NewGuid();
private Guid newID = Guid.Empty;
AddCarDialog addCarDialog; 


protected override OnInitialized()
{
newID = NewRecord;
base.OnInitialized();
}

现在,当我将“@newID”放在 NewEntry.razor 页面上的任何位置时,它会正确显示新的 GUID。

我需要将@newID传递到共享文件夹中的 AddCarDialog 页面。在花了一天多的时间之后,我正在寻求帮助。

这是我在 NewEntry.razor.cs 页面上的 Showpopup 代码中的位置,该代码打开 AddCarDialog。

protected void Showpopup()
{
addCarDialog.carPK = newID;
addCarDialog.ShowDialog = true;
}

AddCarDialog.razor.cs 的代码

[Parameter]
public Guid carPk {get; set} = new

要在 AddCarDialog.razor 上显示的代码

@carPk

编辑/更新:

我现在使用下面的示例,来自 Dimitris,并且没有收到任何错误。但是,我注意到另一个问题

加载 NewEntry.razor 时,AddCarDialog.razor 加载两次!我设置了一个中断 OnInitialized,看看发生了什么。这是我所知道的:

NewEntry.razor 加载。在完全加载之前,AddCarDialog 加载一次,carPK 是正确的。然后,出于某种奇怪的原因,AddCarDialog 第二次加载,carPK 为空。

我需要弄清楚为什么它在这里加载两次以及如何阻止它。

C# Blazor 参数传递 Blazor-组件

评论

0赞 Dimitris Maragkos 3/15/2023
这回答了你的问题吗?此 Blazor EditForm 的错误是什么?
0赞 MrC aka Shaun Curtis 3/15/2023
我假设“EditForm 需要 Model 参数或 EditContext 参数”是 上的错误。但是,您在问题中没有显示这样的代码块(因此无法弄清楚发生了什么),只是一些代码设置参数和手动设置组件的尝试,@Dimitris Maragkos 在他的回答中已经解决了这个问题。AddCarDialog
0赞 ExecChef 3/16/2023
经过一番研究,我不认为“EditForm”是问题所在。我已将其更改为可编辑的形式,测试如何执行此操作,但忘记将其设置回去。我不再收到编辑错误。但是我仍然没有正确传递参数

答:

1赞 Dimitris Maragkos 3/15/2023 #1

不应手动实例化 Blazor 组件,也不应从代码中将参数传递给这些组件。以下是错误的:

AddCarDialog addCarDialog = new();
addCarDialog.CarPk = newID;

相反,您应该像这样使用组件:

NewEntry.razor:

...

<AddCarDialog CarPk="@newID" @bind-Visible="isDialogVisible" />

@code {
    [Parameter]
    public Guid NewRecord { get; set; } = Guid.NewGuid();

    private Guid newID = Guid.Empty;

    private bool isDialogVisible = false;

    protected override void OnInitialized()
    {
        newID = NewRecord;
        base.OnInitialized();
    }

    private void ShowDialog()
    {
        isDialogVisible = true;
    }
}

和:AddCarDialog.razor

@if (Visible)
{
    @*dialog implementation*@
    <button @onclick="Close">Close dialog</button>
}

@code {
    [Parameter]
    public Guid CarPk { get; set; }

    [Parameter]
    public bool Visible { get; set; }

    [Parameter]
    public EventCallback<bool> VisibleChanged { get; set; }

    private async Task Close()
    {
        await VisibleChanged.InvokeAsync(false);
    }
}

评论

0赞 ExecChef 3/16/2023
谢谢你提供这个例子。我正在尝试在我自己的代码中实现它。我不再收到任何错误。但是,Guid 参数未传递。在 NewEntry.razor 中,我添加了 <AddCarDialog CarPk=“@newID” @bind-Visible=“isDialogVisible” />,当页面加载时,它会正确显示一个新的 Guid。在 AddCarDialog.razor 上,我添加了 <h3>Batch: @carPk</h3>,但这显示了一个空的 GUID。我做错了什么。我需要@carPk来显示与 NewEntry.razor 相同的 guid。
0赞 Dimitris Maragkos 3/16/2023
看看这个演示,可能会有所帮助。如果您仍有问题,请使用重现问题的代码创建一个演示,以便我们查看。
1赞 ExecChef 3/16/2023
谢谢迪米特里斯!那个演示非常有帮助。我什至不能说足够。使用该演示,我能够立即看到我的问题。我的 <AddCarDialog />都错了。不知何故,直到并排比较,我才注意到这一点。我现在正确地传递了参数!谢谢!!