Можно ли добавить результат асинхронной функции в строку таблицы? - PullRequest
0 голосов
/ 04 ноября 2019

Я создаю веб-клиент для своего REST API и хочу добавить в свою таблицу поле, содержащее результат асинхронной функции.

@foreach(Product item in products)
        {
            <tr>
                <th>@item.Name</th>
                <th>@item.Amount</th>
                <th>@GetUnit(item.UnitID).Result</th>
                <th>@item.PriceNetto</th>
            </tr>
        }


async Task<string> GetUnit(Guid id)
{
    string a = "https://localhost:5001/api/Units/";
    a += id.ToString();
    var temp = await Http.GetJsonAsync<Unit>(a); //it fails here
    return temp.Name;
}

Короче, у меня есть список продуктов и товаровв списке есть свойство "UnitID", которое я использую для запроса GET. Когда я помещаю где-нибудь в коде .Result после результата моей асинхронной функции, отладчик Visual Studio просто пропускает строку, отвечающую за вызов API и «кирпичиков» всего приложения без ошибок и исключений. Затем мне нужно перезапустить проект.

Я пытался создать вторую функцию только для возврата GetUnit(id).Result, но она ничего не дала. Я пытался вернуть весь объект Unit, а затем в таблицу GetUnit(item.UnitID).Name, но он просто представлял объект (я думаю ...). Кажется, все, что мне нужно, это сделать с .Result, но когда я это делаю, это не работает.

Мой API сделан на .Net Core 2.2, а мой клиент на .Net Core 3.0 (шаблон Blazor). Это ошибка или я просто не могу это сделать таким образом? Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

вам не нужно это делать. Я рекомендую вызывать его в асинхронном действии, как показано ниже:
фокусировка бритвы на виде, фокусировка контроллера / модели на данных.

public async Task<IActionResult> SomeAction(Guid id)
{
    var products = ..;
    foreach (var item in products)
    {
        p.UnitID = await GetUnit(item.UnitID);
    }
    return View(products);
}

private async Task<string> GetUnit(Guid id)
{
    string a = "https://localhost:5001/api/Units/";
    a += id.ToString();
    var temp = await Http.GetJsonAsync<Unit>(a); //it fails here
    return temp.Name;
}

public class Product 
{
    public string Name { get; set; }    
    public decimal Amount { get; set; } 
    public string UnitID { get; set; }  
    public string PriceNetto { get; set; }  
}
0 голосов
/ 06 ноября 2019

IMO, вы не можете сделать это таким образом. В Blazor вы можете получить все данные в OnInitializedAsync вместо этого. Сохранить все Name в виде строки List и отобразить данные списка в индексе на основе представления. Например:

@code {

    private List<string> listItems = new List<string>();

    protected override async Task OnInitializedAsync()
    {
        //get products

        foreach (var product in products)
        {
            string a = "https://localhost:5001/api/Units/";
            a += product.UnitID.ToString();
            var temp = await Http.GetJsonAsync<Unit>(a); 

           listItems.Add(temp.Name);
        }
    }
}

Бритва

@{  int i = 0;}
@foreach(Product item in products)
    {
        <tr>
            <th>@item.Name</th>
            <th>@item.Amount</th>
            <th>  @listItems[i] </th>
            <th>@item.PriceNetto</th>
        </tr>
        i++;
    }
...