Blazor Webassembly - System.AggregateException - PullRequest
0 голосов
/ 14 марта 2020

Я создал RESTapi со стандартной функциональностью CRUD. Я проверил все функции с почтальоном, и они работают без проблем.

Я использую эти функции из проекта клиента Blazor, используя Refit, и все функции работают как sharm, кроме функции Delete. Когда я запускаю это, я получаю System.AggregateException с сообщением «Произошла одна или несколько ошибок. (Неверный аргумент: источник не может быть пустым и должен иметь длину)».

Метод Delete имеет guid параметр, и все выглядит одинаково в коде относительно создания, редактирования и удаления, но удаляет трудности. Я схожу с ума здесь, кто-то может выяснить, в чем может быть проблема?

Я использую несколько компонентов (Page + List -> ListItem, и конвейер выглядит так:

  1. ListItem
 <button class="btn btn-danger" @onclick="@(() => Delete.InvokeAsync(Item))">Delete</button>

[Parameter] public BIMObjectCategoryResponse Item { get; set; }
[Parameter] public EventCallback<BIMObjectCategoryResponse> Delete { get; set; }
Список
[Parameter] public IEnumerable<BIMObjectCategoryResponse> Items { get; set; }
[Parameter] public EventCallback<BIMObjectCategoryResponse> Delete { get; set; }
Страница
// Callback - Delete
void Delete(BIMObjectCategoryResponse item)
{
    var response = bimService.DeleteBIMObjectCategoryAsync(item.BIMObjectCategoryGUID);
}

Идеи?

Еще несколько уточнений и упрощений. После тестирования нескольких ответов и рекомендаций, приведенных ниже, проблема, похоже, связана не с принципами обратных вызовов, а с конкретным c методом. Я просто создал одну простую страницу с функцией Init.

// Initialize
protected async override Task OnInitializedAsync()
{
    Guid guid = Guid.Parse("1e9daac1-1a3e-4eab-8e49-45c2993aba4c");

    Console.WriteLine("BeginGet");
    var response1 = await bimService.GetBIMObjectCategoryAsync(guid);
    Console.WriteLine(jsonService.GetString(response1.Content.Data));
    Console.WriteLine("EndGet");

    Console.WriteLine("BeginDelete");
    var response2 = await bimService.DeleteBIMObjectCategoryAsync(guid);
    Console.WriteLine(jsonService.GetString(response2.Content));
    Console.WriteLine("EndDelete");
}

enter image description here

Ответы [ 3 ]

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

Структура вашего компонента Page выглядит следующим образом, верно?

- A (GrandParentComponent)
   -- B (ParentComponent)
   --- C (ChildComponent)

См. этот ответ как эти компоненты могут взаимодействовать ... И применить то, что я делаю здесь, к ваше действие удаления.

Обратите внимание, что в конце моего ответа я предлагаю вместо этого использовать службу уведомлений, чтобы обеспечить связь между компонентами, что, на мой взгляд, может быть жизнеспособным решением в вашем случае. Смотрите здесь мой ответ , как определить и использовать службу уведомлений. Обратите внимание, что второй ответ в этой теме предлагает использовать каскадные значения и параметры. Это третий способ обеспечения связи между компонентами. Это довольно неуклюже и может быть проблематичным c. Я никогда не рекомендую его, но он по-прежнему является законным инструментом и часто используется самой платформой. На мой взгляд, когда связь между двумя компонентами, делегаты мероприятия - лучший выбор. В противном случае, на мой взгляд, комбинация паттернов состояния и паттерна уведомлений - самое простое и элегантное решение.

Надеюсь, это поможет ...

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

Ваш async поток неверен, лучше сначала это исправить. Кажется, ошибка указывает на то, что ваш родительский компонент (страница) выполняет рендеринг перед дочерним элементом, который больше не присутствует.

Начиная с ListItem, вы, вероятно, могли бы исправить это с помощью await в @onclick лямбде, но я предпочитаю сделать процесс более видимым:

<button class="btn btn-danger" @onclick="DeleteItem">Delete</button>

@code {
[Parameter] public BIMObjectCategoryResponse Item { get; set; }
[Parameter] public EventCallback<BIMObjectCategoryResponse> Delete { get; set; }

  async Task DeleteItem()
  {
    // maybe you need Response? 
    var response = await Delete.InvokeAsync(Item);
  }
}

Вы не сделали опубликуйте код обработки на странице, но он также должен правильно связать поток asyn c.

0 голосов
/ 26 марта 2020

Возвращаясь к вопросу, я добавил отчет об ошибке, так как он отлично работает, используя стандартный httpclient вместо Refit. Таким образом, мы можем закрыть это сейчас. Спасибо за все усилия :) / Henrik

...