c# blazor 如何将列表传递给页面
c# blazor how to pass a List to a page
我有第二个页面接收以下参数:
@page "/newrecord/{Employees}"
@inject HttpClient http
<h1>@Employees.Count</h1>
@code {
[Parameter]
public List<Model.Employees> Employees{ get; set; }
}
在我的主页上,单击这样的按钮时我传递了列表:
List<Model.Employees> selected { get; set; }
private void OnAddRecord()
{
NavigationManager.NavigateTo($"newrecord/{this.selected}");
}
单击按钮时出现错误,我可以看到 URL 是这样形成的:
How can I pass this object to the second page? Do I have to use maybe LocalStorage? Or use other type of object?
此类问题的可行解决方案是在服务中实现状态模式和通知模式,以保持对象的状态并通知订阅对象发生变化。因此,您可以创建一个缓存员工集合的服务,允许对象(在本例中为您的主要组件)将员工添加到该集合,并通知订阅者(newrecord)这一事实,允许访问该集合,或者更好以事件参数对象的形式将其从服务传递给订阅者对象。下面是如何实现状态模式和通知模式的基本示例。 (注意:这个示例工作得很好,它不是为答案而创建的...)
Child1.razor
@inject NotifierService Notifier
@implements IDisposable
@inject IState State
<hr />
<input type="checkbox" @bind="State.ShowEasterEggs" />Show Easter Eggs
<hr />
<h1>User puts in something</h1>
<input type="text" @bind="@value" />
<button @onclick="@AddValue">Add value</button>
@foreach (var value in Notifier.ValuesList)
{
<p>@value</p>
}
@code {
private string value { get; set; }
public void AddValue()
{
Notifier.AddTolist(value);
}
public async Task OnNotify()
{
await InvokeAsync(() =>
{
StateHasChanged();
});
}
protected override void OnInitialized()
{
Notifier.Notify += OnNotify;
}
public void Dispose()
{
Notifier.Notify -= OnNotify;
}
}
Child2.razor
@inject NotifierService Notifier
@implements IDisposable
@inject IState State
<hr />
@if (State.ShowEasterEggs)
{
<span>EASTER EGGS SHOWN</span>
}
<hr />
<h1>Displays Value from service and lets user put in new value</h1>
<input type="text" @bind="@value" />
<button @onclick="@AddValue">Set Value</button>
@code {
private string value { get; set; }
public void AddValue()
{
Notifier.AddTolist(value);
}
protected override void OnInitialized()
{
State.Notify += OnNotify;
}
public void OnNotify()
{
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void Dispose()
{
State.Notify -= OnNotify;
}
}
NotifierService.cs
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using ChildComponentsCommunication.Shared;
using Microsoft.AspNetCore.Components;
namespace ChildComponentsCommunication
{
public class NotifierService
{
private readonly List<string> values = new List<string>();
public IReadOnlyList<string> ValuesList => values;
public NotifierService()
{
}
public async void AddTolist(string value)
{
values.Add(value);
if (Notify != null)
{
await Notify?.Invoke();
}
}
public event Func<Task> Notify;
}
}
IState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ChildComponentsCommunication
{
public interface IState
{
event Action Notify;
bool ShowEasterEggs { get; set; }
}
public class State : IState
{
public event Action Notify;
bool showEggs = false;
public bool ShowEasterEggs
{
get => showEggs;
set
{
if (showEggs != value)
{
showEggs = value;
if (Notify != null)
{
Notify?.Invoke();
}
}
}
}
}
}
Startup.ConfigureServices
services.AddSingleton<IState, State>();
services.AddScoped<NotifierService>();
希望这能奏效...
我有第二个页面接收以下参数:
@page "/newrecord/{Employees}"
@inject HttpClient http
<h1>@Employees.Count</h1>
@code {
[Parameter]
public List<Model.Employees> Employees{ get; set; }
}
在我的主页上,单击这样的按钮时我传递了列表:
List<Model.Employees> selected { get; set; }
private void OnAddRecord()
{
NavigationManager.NavigateTo($"newrecord/{this.selected}");
}
单击按钮时出现错误,我可以看到 URL 是这样形成的:
How can I pass this object to the second page? Do I have to use maybe LocalStorage? Or use other type of object?
此类问题的可行解决方案是在服务中实现状态模式和通知模式,以保持对象的状态并通知订阅对象发生变化。因此,您可以创建一个缓存员工集合的服务,允许对象(在本例中为您的主要组件)将员工添加到该集合,并通知订阅者(newrecord)这一事实,允许访问该集合,或者更好以事件参数对象的形式将其从服务传递给订阅者对象。下面是如何实现状态模式和通知模式的基本示例。 (注意:这个示例工作得很好,它不是为答案而创建的...)
Child1.razor
@inject NotifierService Notifier
@implements IDisposable
@inject IState State
<hr />
<input type="checkbox" @bind="State.ShowEasterEggs" />Show Easter Eggs
<hr />
<h1>User puts in something</h1>
<input type="text" @bind="@value" />
<button @onclick="@AddValue">Add value</button>
@foreach (var value in Notifier.ValuesList)
{
<p>@value</p>
}
@code {
private string value { get; set; }
public void AddValue()
{
Notifier.AddTolist(value);
}
public async Task OnNotify()
{
await InvokeAsync(() =>
{
StateHasChanged();
});
}
protected override void OnInitialized()
{
Notifier.Notify += OnNotify;
}
public void Dispose()
{
Notifier.Notify -= OnNotify;
}
}
Child2.razor
@inject NotifierService Notifier
@implements IDisposable
@inject IState State
<hr />
@if (State.ShowEasterEggs)
{
<span>EASTER EGGS SHOWN</span>
}
<hr />
<h1>Displays Value from service and lets user put in new value</h1>
<input type="text" @bind="@value" />
<button @onclick="@AddValue">Set Value</button>
@code {
private string value { get; set; }
public void AddValue()
{
Notifier.AddTolist(value);
}
protected override void OnInitialized()
{
State.Notify += OnNotify;
}
public void OnNotify()
{
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void Dispose()
{
State.Notify -= OnNotify;
}
}
NotifierService.cs
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using ChildComponentsCommunication.Shared;
using Microsoft.AspNetCore.Components;
namespace ChildComponentsCommunication
{
public class NotifierService
{
private readonly List<string> values = new List<string>();
public IReadOnlyList<string> ValuesList => values;
public NotifierService()
{
}
public async void AddTolist(string value)
{
values.Add(value);
if (Notify != null)
{
await Notify?.Invoke();
}
}
public event Func<Task> Notify;
}
}
IState.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ChildComponentsCommunication
{
public interface IState
{
event Action Notify;
bool ShowEasterEggs { get; set; }
}
public class State : IState
{
public event Action Notify;
bool showEggs = false;
public bool ShowEasterEggs
{
get => showEggs;
set
{
if (showEggs != value)
{
showEggs = value;
if (Notify != null)
{
Notify?.Invoke();
}
}
}
}
}
}
Startup.ConfigureServices
services.AddSingleton<IState, State>();
services.AddScoped<NotifierService>();
希望这能奏效...