c# Blazor, как передать список на страницу - PullRequest
0 голосов
/ 25 марта 2020

У меня есть вторая страница, которая получает следующий параметр:

@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 формируется следующим образом:

enter image description here

Как передать этот объект вторая страница? Должен ли я использовать, возможно, LocalStorage? Или использовать другой тип объекта?

1 Ответ

1 голос
/ 25 марта 2020

Жизнеспособным решением такой проблемы является реализация шаблона состояния и шаблона уведомления в сервисе, который сохраняет состояние объектов и уведомляет подписывающиеся объекты об изменениях. Таким образом, вы можете создать службу, которая будет кэшировать коллекцию сотрудников, разрешать объектам (в данном случае вашему главному компоненту) добавлять сотрудников в эту коллекцию и уведомлять подписчиков (newrecord) об этом факте, предоставляя доступ к этой коллекции или, что еще лучше, передача его от сервиса к объекту-подписчику в виде объекта args события. Вот базовый c пример того, как реализовать шаблон состояния и шаблон уведомления. (примечание: этот пример отлично работает, и он не был создан для ответа ...)

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>();

Надеюсь, это работает ...

...