Search code examples
c#blazorblazor-webassembly

Blazor C# Why is Route Parameter Always 0 or Null?


I have the following code:

@using Maelstrom.UI.Web.Shared.Widgets
@using Maelstrom.UI.Web.Shared.Utility

@page "/backlog/{B}"


<ServiceItemWidget>
    <ServiceItemHeaderTemplate>
        <ServiceItemHeaderWidget ServiceItemIdentifier="@B" ServiceItemName="Test Backlog"/>
    </ServiceItemHeaderTemplate>
    <ServiceItemMenuTemplate>
        <ServiceMenuWidget Choices="_choices"/>
    </ServiceItemMenuTemplate>
    <ServiceItemContentTemplate>
        <Switch>
            <Route Template="@GetBacklogTemplate("Dashboard")">
                <BacklogItemDashboard/>
            </Route>
            <Route Template="@GetBacklogTemplate("Profile")">
                <BacklogItemProfile/>
            </Route>
            <Route Template="@GetBacklogTemplate("UserStories")">
                <BacklogItemUserStories/>
            </Route>
            <Route Template="@GetBacklogTemplate("Discussion")">
                <BacklogItemDiscussion/>
            </Route>
            <Route Template="@GetBacklogTemplate("Communication")">
                <BacklogItemCommunication/>
            </Route>
        </Switch>
    </ServiceItemContentTemplate>
</ServiceItemWidget>

@code
{
    [Parameter]
    public string B { get; set; }

    private static int _backlogId;

    protected override async Task OnInitializedAsync()
    {
        //_backlogId = B;
        //_backlogId = 1;
    }

    private string GetBacklogTemplate(string page)
    {
        var href = string.Empty;

        switch (page)
        {
            case "Dashboard":
                href = $@"/backlog/{_backlogId}/dashboard";
                break;
            case "Profile":
                href = $@"/backlog/{_backlogId}/profile";
                break;
            case "UserStories":
                href = $@"/backlog/{_backlogId}/userstories";
                break;
            case "Discussion":
                href = $@"/backlog/{_backlogId}/discussion";
                break;
            case "Communication":
                href = $@"/backlog/{_backlogId}/communication";
                break;
        }

        return href;
    }

    private readonly List<MenuChoice> _choices = new()
    {
        new MenuChoice()
        {
            To = $"/backlog/{_backlogId}/dashboard",
            Caption = "Dashboard"
        },
        new MenuChoice()
        {
            To = $"/backlog/{_backlogId}/profile",
            Caption = "Profile"
        },
        new MenuChoice()
        {
            To = $"/backlog/{_backlogId}/userstories",
            Caption = "User Stories"
        },
        new MenuChoice()
        {
            To = $"/backlog/{_backlogId}/discussion",
            Caption = "Discussion"
        },
        new MenuChoice()
        {
            To = $"/backlog/{_backlogId}/communication",
            Caption = "Communication"
        }
    };
}

The issue is that when I go to /backlog/1 for example parameter B is always 0 or null. I've tried declaring it as both an int and a string to see if that mattered. From what I've seen on Google, this should work. Can anyone spot something I'm missing? Thanks in advance.

Jason


Solution

  • Answer was right here:

    https://github.com/hez2010/BlazorRouter/blob/master/BlazorRouter.Sample/Pages/Counter.razor

    <h1>Counter</h1>
    
    <p>Current count: @CurrentCount</p>
    
    <button class="btn btn-primary" @onclick="() => ChangeCount(CurrentCount + 1)">Click me</button>
    
    @code {
        [Parameter] public int CurrentCount { get; set; } = 0;
        [Parameter] public EventCallback<int> CurrentCountChanged { get; set; }
        [Parameter] public Action<int> ChangeCount { get; set; }
        [CascadingParameter(Name = "RouteParameters")] IDictionary<string, object> parameters { get; set; }
        private bool parameterHasSet = false;
    
        protected override Task OnParametersSetAsync()
        {
            if (parameterHasSet) return Task.CompletedTask;
            parameterHasSet = true;
            base.OnParametersSetAsync();
            if (parameters != null)
            {
                CurrentCount = (int)parameters["init"];
                ChangeCount(CurrentCount);
            }
            return Task.CompletedTask;
        }
    }