提问人:ExecChef 提问时间:3/15/2023 最后编辑:ExecChef 更新时间:3/16/2023 访问量:369
在 Blazor 中传递简单参数(以前称为 TempData)Simple Parameter Passing in Blazor (previously TempData)
Simple Parameter Passing in Blazor (Previously TempData)
问:
我对 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 为空。
我需要弄清楚为什么它在这里加载两次以及如何阻止它。
答:
不应手动实例化 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);
}
}
评论
AddCarDialog