Search code examples
c#blazorparameter-passingblazor-component

Simple Parameter Passing in Blazor (Previously TempData)


I am very new to Blazor (coming from a medium level of asp.net experience).

Previously, I used ViewBag & TempData to pass variables from one component to another, quite effectively and easily. This is not avail in Blazor and I am struggling to understand how to pass a variable to another component. I have, indeed, read many posts and online resources. But they don't seem to make sense to me, for what I am trying to do.

I tried to make a very simple example of what I am trying to accomplish:

When the NewEntry.razor page loads, I need to create a new GUID for the new record entry that stuff will create (newID).

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


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

Now, when I place '@newID' anywhere on the NewEntry.razor page, it shows the new GUID correctly.

I need to pass @newID to the AddCarDialog page in the shared folder. After spending more than a day on this, I am asking for help.

This is where I am at in my Showpopup code on the NewEntry.razor.cs page, that opens AddCarDialog.

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

Code for AddCarDialog.razor.cs

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

Code to display on AddCarDialog.razor

@carPk

EDIT/Update:

I am now using the example below, from Dimitris, and not receiving any errors. However, I am noticing another issue

When NewEntry.razor loads, AddCarDialog.razor loads twice! I set a break OnInitialized, to see what is happening. Here is what I know:

NewEntry.razor loads. Before fully loading, AddCarDialog loads once, and carPK is correct. Then, for some odd reason, AddCarDialog loads a second time and carPK is empty.

I need to figure out why it's loading twice here and how to stop it.


Solution

  • You should not instantiate Blazor components manually and pass parameters to them from code. The following is wrong:

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

    instead you should use the component like this:

    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;
        }
    }
    

    And 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);
        }
    }