Как передать параметр ID в Blazorise модальный при нажатии кнопки, от одного компонента к другому?

#c# #blazor #blazorise

#c# #blazor #blazorise

Вопрос:

Я новичок и пытаюсь сформулировать это как можно лучше. Так много новых концепций, которые нужно освоить! Пожалуйста, скажите мне, если я неясен.

Я создаю Todo-приложение в качестве упражнения. При загрузке страницы я получаю элементы задач из базы данных и повторяю их в цикле foreach, каждому todo присваивается X-кнопка для удаления. Это было легко, но для изменения текста задачи мне нужна кнопка обновления, которая вызывает модальное всплывающее окно Blazorise, чтобы использовать его поле ввода.

Моя проблема в том, что я не понимаю, как передать идентификатор каждого элемента todo в этот модальный, для каждой кнопки, которая есть. Для кнопки удаления я мог бы использовать «TodoItem» цикла foreach.Переменная Id», но поскольку Blazorise модальный — это другой компонент, я не могу.

Вот как выглядит моя индексная страница:

 @page "/"
@using TodoApp.App.Components

<section class="todo-container">
    @if (TodoItems != null)
    {
        @foreach (var todoItem in TodoItems)
        {
            if (todoItem.IsDone == false)
            {
                <div class="todo-item">
                    <p>@todoItem.Text</p>
                    <UpdatePopup OnTodoItemUpdated="UpdateAndLoad"></UpdatePopup>
                    <Button class="remove-btn" Clicked="(() => RemoveTodoItem(todoItem.Id))">X</Button>
                </div>
            }
        }
    }
</section>

<Popup OnTodoItemAdded="UpdateAndLoad"></Popup>

  

Эта кнопка находится внутри самого модального: <Button Clicked="@ShowModal">...</Button> , и я бы хотел сделать то же самое, что и с кнопкой удаления, добавив что-то вроде () => UpdateTodoItem(todoItem.Id) .

Как получить идентификатор из каждого элемента в компоненте Index и добавить его к каждой кнопке в модальном компоненте?

Ответ №1:

С вашим решением связано несколько проблем. Во-первых, вы создаете модальный для каждого элемента todo ( UpdatePopup ), что очень неэффективно. Вместо этого вы должны создать только один модальный режим обновления и использовать его для всех элементов.

 @page "/"
@using TodoApp.App.Components

<section class="todo-container">
    @if (TodoItems != null)
    {
        @foreach (var todoItem in TodoItems)
        {
            if (todoItem.IsDone == false)
            {
                <div class="todo-item">
                    <p>@todoItem.Text</p>
                    <Button class="update-btn" Clicked="(() => updatePopupRef.Show(todoItem))">Edit</Button>
                    <Button class="remove-btn" Clicked="(() => RemoveTodoItem(todoItem.Id))">X</Button>
                </div>
            }
        }
    }
</section>

<UpdatePopup @ref="@updatePopupRef" OnTodoItemUpdated="UpdateAndLoad" />

<Popup OnTodoItemAdded="UpdateAndLoad" />
@code{
UpdatePopup updatePopupRef;
}
  

И тогда у UpdatePopup вас есть что-то вроде этого:

 void Show(TodoItem item)
{
    this.Item = item; // use this to bind item values to input fields

    modalRef.Show(); // you also need to have modalRef set with @ref attribute
}
  

и в razor

 <TextEdit @bind-Text="@Item.Name" />
  

PS. Я не тестировал этот код, но у вас должно быть общее представление 🙂

Комментарии:

1. Вау, большое вам спасибо! Это действительно помогло мне. Пометил его как ответ. 🙂