Я вызвал цикл обратной передачи, используя Javascript Onload для запуска образа updateprogress

У меня есть страница asp.net, которая должна заполнить древовидную структуру на основе структуры каталогов. Вместо того, чтобы пользователь смотрел на пустую страницу при создании узлов, я пытаюсь использовать UpdateProgress для загрузки изображения.

Поиск по различным темам в Интернете дал мне несколько разных вещей, которые я пробовал, и у каждой из них есть свои проблемы, которые я не могу решить.

Вариант 1 использует следующий JavaScript:

function pageLoad() {
        __doPostBack('btnBuildTree', '');
    }

Это событие автоматически подключено, поэтому мне не нужно добавлять тег onload к элементу body. Для тестирования мой код выглядит так:

protected void btnBuildTree_Click(object sender, EventArgs e)
     {
           System.Threading.Thread.Sleep(5000);
           // minor code here to know it did something
     }

Когда я настроил это так, страница загружается, процесс обновления выполняется так, как я хочу, и когда btnBuildTree_Click завершает обновления UpdatePanel, и все замечательно, за исключением того, что он немедленно запускает другую обратную передачу, запускает функцию javascript pageLoad(), что заставляет btnBuildTree выполнять обратную передачу и так далее.

Вариант 2 имеет только одно изменение, и это касается JavaScript:

function buildTree() {
    __doPostBack('btnBuildTree', '');
    }

И я добавляю этот тег:

<body onload="buildTree()">

С этой настройкой страница загружается, событие btnBuildTree_Click запускается и выполняет всю свою работу, а когда оно закончено, оно не вызывает другую обратную передачу, поэтому у меня нет цикла. Единственным недостатком этого является то, что UpdateProgress никогда не показывается, поэтому он побеждает саму цель создания "экрана загрузки".

Я считаю, что я просто что-то упускаю, и я надеюсь, что кто-то может указать, что это такое.

Спасибо!

2 ответа

Решение

Ваша функция pageLoad() вызывается для всех обратных передач, включая асинхронные обратные передачи. В функции pageLoad() вы можете добавить логику, чтобы узнать, отображалось ли древовидное представление.

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

function pageLoad() {
   var loading = $("#treeview-loading"); // Using jQuery to find the loading indicator.
   if (loading.get(0)) {
      __doPostBack('btnBuildTree', '');
   }
}

Как вы добавляете JS для загрузки страницы?

Если это добавлено Page_Load с помощью RegisterStartupScript или похож, добавить !IsPostBack убедитесь, что он не будет заново добавлять себя каждый раз, когда вызывается обработчик событий btnBuildTree_Click.

Другие вопросы по тегам