powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / передача параметров в метод сервиса blazor и вызов компонентов
25 сообщений из 72, страница 1 из 3
передача параметров в метод сервиса blazor и вызов компонентов
    #39958313
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте! У меня приложение blazor server по типовому образцу. В нем я создал свой компонент "GoodStock, который загружает данные из базы данных используя метод сервиса, который делает выборку по параметрам. Я так же определил компонент радиобатн. Нужно , что бы по клику на этой радиобатн происходила загрузка компонента GoodStock и при этом в метод сервиса передавался параметр этой радиобатн(в данном случае "0" или "1"). Как это сделать, ведь компонент радиобатн и компонент GoodStock не являются друг к другу дочерним и родительским? Может быть мой вопрос непонятен и нужны какие то пояснения или код?
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39958314
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp
компонент радиобатн и компонент GoodStock не являются друг к другу дочерним и родительским?
ну значит у тебя есть какой-то родительский компонент, в котором находятся оба этих компонента.
В итоге в разметке родительского компонента ты пишешь
Код: html
1.
2.
3.
@if (_showGoodStock) {
  <GoodStock RadioValue=@_radioValue />
}



Соответственно, по клику на радиобатоне родительский компонент устанавливает своё поле _showGoodStock=true, а в компоненте GoodStock у тебя должен быть [Parameter], который примет значение радиобатона.
Как-то так
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39958315
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp
GoodStock, который загружает данные из базы данных используя метод сервиса
а что касается сервиса - раз данные загружает компонент GoodStock, то ему и @inject в руки
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39958321
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, Спасибо, попробую разобраться!
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39958693
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вывел в родительский компонент булеву переменную , которая меняется в зависимости от положения switch. Но теперь проблема в том, что этот компонент _mainLayout и дочка передается через @body. И что теперь делать не знаю, читаю документацию . Если кто знает- подскажите!!
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39959370
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp, Всё. Уперся в стену. Пошел angular учить.
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39959399
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp,
я тоже также поступил когда разбирался с ASP MVC.
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39960647
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
@code {
                [Parameter]
    public bool Gender { get; set; }
    List<ViewGoodsStocksMvc> objGoods;
    protected override async Task OnInitializedAsync()
    {
        objGoods = await Task.Run(() => objGoodStockService.GetGoods(Gender));
    }
}


Ну вот я передал параметр в дочерний компонент(из сестринского в сестринский через родительский). Но теперь в родительском компоненте я должен кликнуть радиобатн и параметр должен поменяться. Как сделать, чтобы метод сервиса выполнился с новым параметром и компонент перезагрузился?
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39960746
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем нужно делать так, чтобы компонент перезагружался???

Если нужно обновить экран, есть StateHasChanged
Если нужно переинициализовать компонент - вынеси всю инициализацию в отдельный метод и вызывай его например при смене параметра (set {...})
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
    protected override async Task OnInitializedAsync()
    {
        await InitAsync();
    }

    private async Task InitAsync()
    {
        objGoods = await Task.Run(() => objGoodStockService.GetGoods(Gender));
    }
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39960816
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Простите, А как вызвать метод внутри компонента при смене параметра?
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39960823
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp
Простите, А как вызвать метод внутри компонента при смене параметра?
Через сеттер. Параметр - это обычное свойство класса, тут никакого волшебства.

Только с асинхронностью надо смотреть, что там в задаче. Если GetGoods - быстрый метод, можно просто вызвать его синхронно. Если там IO - лучше запустить задачу без ожидания, а по окончании InvokeAsync(StateHasChanged). (правда, непонятно, почему он тогда сам не является асинхронным, но это другой вопрос)
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39960829
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp
Shocker.Pro,
Простите, А как вызвать метод внутри компонента при смене параметра?

Вроде нашел статью про {set}
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39960832
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp
Вроде нашел статью про {set}
хм.... лучше прочесть учебник по основам типов в .NET и по C# в частности, а не только эту статью, а то будет непросто...
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961342
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, Я учил. Честно. Поставьте тройку пожалуйста)))) Просто не сталкивался с такого рода событиями. Это мне костыль какой то напоминает. Думаю, может у меня что то в архитектуре не правильно.
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961351
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем тут "такого рода события"? Это базовые основы типов в .NET, не имеющие отношения к Blazor

Я структуру твою в целом не вижу, но почему ты считаешь это костылем - не понимаю, это обычный способ применения свойств в .NET
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961366
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
У меня знания слабые. Я делаю себе приложение для магазина одежды . Десктопная часть уже готова на WF, теперь интернет магазин стряпаю потихонечку. Хочется вроде, что бы были компоненты. Индекс - родительский. Дочерние: 1-меню с радиокнопкой выбора пола. 2-карточки товаров. остальное меню категорий еще далеко впереди. Мне не нравится, что приходится 1 событие тащить через два компонента вверх и вниз. Ну да ладно. Я события не очень хорошо понимаю, привык в WF привязываться к кнопкам а суть еще предстоит постичь. Еще раз благодарю за ответы.
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961371
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp
Я события не очень хорошо понимаю
В приведенных примерах события не используются вовсе, поэтому суть сокрушений непонятна вообще.
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961412
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, Понял! Вот я ступил.
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961424
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
@page "/goodstock"
@using jeansBlazorAsh.Data
@using jeansBlazorAsh.Models
@inject GoodStockService objGoodStockService

<NavLink class="nav-link" href="">
    <span class="oi oi-plus" aria-hidden="true"></span>
</NavLink>
<h1>Информация о товарах</h1>
<button @onclick="OnInitializedAsync">Кнопка</button>

@if (objGoods == null)
{
    <p><em>Loading....</em></p>
}
else
{
    <div class=" col card-columns">
        @foreach (ViewGoodsStocksMvc vgs in objGoods)
        {
            <div class="card bg-light">
                <div class="card-body text-center">
                    <p class="card-text">
                        @vgs.Type
                        <span>@vgs.ManufName</span>
                        <span>@vgs.ModelName</span>
                        <span>@vgs.Widht</span>
                        <span>@vgs.LenghtId</span>
                    </p>
                    <img class="card-img-top img-fluid" src=@vgs.NomenclImagePath>
                    <div class="card-body">
                        <h4 class="card-title">@vgs.CurrentPrice</h4>
                        @if (vgs.FabricDensity != null)
                        {
                            <p class="card-text">
                                плотность &ensp;<span class="font-weight-bold">@vgs.FabricDensity</span>
                                <span>&ensp;oz</span>
                            </p>
                        }

                        <p class="card-text">@vgs.Description</p>
                        <a href="#" class="btn btn-primary">В корзину</a>
                    </div>
                </div>
            </div>
        }

    </div>
}

@code {

    public bool gender;
    [Parameter]
    public bool Gender
    {
        get
        {
            return gender;
        }
        set
        {
            gender = value;
            OnInitializedAsync();

        }
    }
    List<ViewGoodsStocksMvc> objGoods;

    protected override async Task OnInitializedAsync()
    {
        await InitAsync();
    }

    private async Task InitAsync()
    {
        objGoods = await Task.Run(() => objGoodStockService.GetGoods(Gender));
    }
}


Если я вызываю метод OnInitializedAsync() кнопкой
Код: html
1.
<button @onclick="OnInitializedAsync">Кнопка</button>

- все работает. А из сеттера пишет ошибку
'An attempt was made to use the context while it is being configured. A DbContext instance cannot be used inside OnConfiguring since it is still being configured at this point. This can happen if a second operation is started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.'
Метод GetGoods в сервисе - обычный
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public List<ViewGoodsStocksMvc> GetGoods(bool gender)
        {
            var goodList = (from good in _db.ViewGoodsStocksMvc.AsNoTracking()
                            where good.GenderM == gender
                            select good).ToList();
            return goodList;

        }

и ошибка происходит как раз в нем.
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961426
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public bool gender;
    [Parameter]
    public bool Gender
    {
        get
        {
            return gender;
        }
        set
        {
            gender = value;
            //OnInitializedAsync();
            objGoodStockService.GetGoods(gender);
            InvokeAsync(StateHasChanged);
        }
    }

jeanssp, так просто не работает. ни чего не происходит
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961447
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так, естественно, ничего не будет работать. Тебе нужно получше изучить тему асинхронности в C#/.NET

Смысл в том, что ты не ожидаешь, когда у тебя завершится задача обращения к БД, а сразу пытаешься обновить компонент, естественно, ничего не происходит. Тут сразу много косяков в этом коде, ща попробую расписать
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961449
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых - не надо вызывать служебную функцию OnInitializedAsync из разметки. Я ведь специально выше написал, чтобы ты вынес инициализацию в отдельную функцию, чтобы ее можно было вызывать отдельно (честно говоря, я до этого отвечал, рассчитывая на определенную квалификацию, придется сделать скидку)

Во-вторых - в 2020-м году не надо делать синхронные методы репозитория, а потом заворачивать их в таски. EF поддерживает асинхронные методы, их и надо использовать, таким образом:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public async Task<List<ViewGoodsStocksMvc>> GetGoodsAsync(bool gender)
        {
            var goodList = await (from good in _db.ViewGoodsStocksMvc.AsNoTracking()
                            where good.GenderM == gender
                            select good).ToListAsync();
            return goodList;

        }

(кстати, тут не помешает вспомнить про сортировку....)
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961451
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3) Соответственно, вызов репозитория у тебя превращается в

Код: c#
1.
2.
3.
4.
5.
    private async Task InitAsync()
    {
        objGoods = await objGoodStockService.GetGoodsAsync(Gender);
        await InvokeAsync(StateHasChanged);
    }

то есть обновлять внешний вид компонента нужно ПОСЛЕ того, как репозиторий вернет тебе список товаров, а не ДО
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961453
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4) Параметр соответственно, должен вызывать функцию инициализации (хотя я бы её переименовал в RefreshListAsync - по её сути) без ожидания результата, чтобы не влиять на рендеринг вышестоящего компонента
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    [Parameter]
    public bool Gender
    {
        get
        {
            return gender;
        }
        set
        {
            gender = value;
            InitAsync();
        }
    }
...
Рейтинг: 0 / 0
передача параметров в метод сервиса blazor и вызов компонентов
    #39961454
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5) Что касается инициализации компонента - а вот тут я как раз не стал бы ожидать ответа от БД - это операция длительная. Пусть сначала будет выведено "Loading...", а когда список товаров подгрузится, то компонент обновиться и выведет список товаров. Так что можно вызвать без ожидания
Код: c#
1.
2.
3.
4.
5.
    protected override async Task OnInitializedAsync()
    {
        // запускаем без ожидания, для отзывчивости UI
        InitAsync();
    }
...
Рейтинг: 0 / 0
25 сообщений из 72, страница 1 из 3
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / передача параметров в метод сервиса blazor и вызов компонентов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]