Razor / Syncfusion: при асинхронной загрузке страницы древовидные данные не будут заполняться, если я не выполню действие

#c# #blazor #syncfusion

#c# #blazor #syncfusion

Вопрос:

Итак, я пишу это приложение в razor и прямо сейчас создаю пользовательскую панель навигации. Теперь проблема в OnInitialized событии, которое я написал:

  protected async override void OnInitialized()
    {
        base.OnInitialized();
        var user = (await AuthStat).User;
        if (user.Identity.IsAuthenticated)
        {
            await Authenticated();
        }
        else
        {
            await NotAuthenticated();
        }
    }
  

Где функции:

  protected Task Authenticated()
    {
        treedata = null;
        treedata = new List<TreeData>();
        treedata.Add(new TreeData { nodeId = "01", nodeText = "Acasa", iconCss = "icon-microchip icon" });
        treedata.Add(new TreeData { nodeId = "03", nodeText = "Logout", iconCss = "icon-thumbs-up-alt icon" });
        treedata.Add(new TreeData { nodeId = "04", nodeText = "Vremea", iconCss = "icon-th icon" });
        treedata.Add(new TreeData { nodeId = "05", nodeText = "Profil", iconCss = "icon-code icon" });
        treedata.Add(new TreeData { nodeId = "06", nodeText = "Calcul Salariu", iconCss = "icon-chrome icon" });
        treedata.Add(new TreeData { nodeId = "07", nodeText = "Mijloace Fixe", iconCss = "icon-up-hand icon" });
        return Task.CompletedTask;

    }

    protected Task NotAuthenticated()
    {
        treedata = null;
        treedata = new List<TreeData>();
        treedata.Add(new TreeData { nodeId = "01", nodeText = "Acasa", iconCss = "icon-microchip icon" });
        treedata.Add(new TreeData { nodeId = "02", nodeText = "Login", iconCss = "icon-docs icon" });
        treedata.Add(new TreeData { nodeId = "04", nodeText = "Vremea", iconCss = "icon-th icon" });
        treedata.Add(new TreeData { nodeId = "06", nodeText = "Calcul Salariu", iconCss = "icon-chrome icon" });
        return Task.CompletedTask;
    }
  

Переменная treedata равна:

 SfTreeView<TreeData> TreeView;
   public class TreeData
   {
       public string nodeId { get; set; }
       public string nodeText { get; set; }
       public string iconCss { get; set; }
       public bool hasChild { get; set; }
       public string pid { get; set; }
   }
  

Моя проблема заключается в следующем: всякий раз, когда страница загружается, древовидные данные будут заполняться только при выполнении действия (т. Е. Поиска или переключения меню навигации), и я хочу показать, когда страница загружается, но я не знаю как.

Ответ №1:

 //protected async override void OnInitialized()
  protected override async Task OnInitializedAsync()
  {
    // base.OnInitialized();
    // ...  like before
  

async void Метод не (не может быть) ожидаемым. Ваши аутентифицированные / неаутентифицированные методы не синхронизированы с рендерингом.

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

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

Ответ №2:

Мы проверили ваш прикрепленный код и выяснили, что вы использовали метод await для получения имени пользователя и источника данных TreeView. Этой функции требуется некоторое время для извлечения имени пользователя и источника данных компонента TreeView. Компонент TreeView не ожидает, пока данные не будут извлечены из этой функции, поэтому он отображается с использованием пустого источника данных. Это причина проблемы, о которой вы сообщили.

Мы уже рассматривали эту проблему как поддержку функций, которая будет реализована в компоненте TreeView. Поддержка этой функции будет включена в наш выпуск тома 3, который, как ожидается, будет выпущен в конце сентября 2020 года.

Мы ценим ваше терпение.

С уважением, Sowmiya. P

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

1. Большое спасибо! Мне удалось заставить его функционировать, создав viewmodel и затем вызвав его на странице!