[英]Blazor C# Why is Route Parameter Always 0 or Null?
我有以下代码:
@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"
}
};
}
问题是,当我转到 /backlog/1 时,例如参数 B 始终为 0 或 null。 我尝试将它声明为 int 和 string 以查看是否重要。 从我在谷歌上看到的,这应该有效。 谁能发现我缺少的东西? 提前致谢。
杰森
我相信当你回去你的组件重新初始化并重置 B 的值时,你应该使用 LocalStorage 或 SessionStorage 来存储 B 的值并使用 get, set 这些存储的方法来更新和使用它的值。 文档
答案就在这里:
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;
}
}
B 总是 null 还是 0?
也许您可以尝试在 InitializeAsync 上检查它是否为空,因为有时界面构建速度比OnInitializedAsync
快
@code{
private bool dataFetch {get;set;}
protected override async Task OnInitializedAsync()
{
while(!String.IsNullOrEmpty(B))
dataFetch = true; //try to log the b if has value
}
}
然后在你的标记中
@if(dataFetch)
{
<ServiceItemWidget>
........
}else{
//progress
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.