AsyncRendering свойство на элементе управления ASP.Net ReportViewer является одним из наиболее недооцененных свойств на ReportViewer. И это наша вина. Есть много побочных эффектов для установки этого свойства, которое вы не ожидаете от имени. Фактически, большую часть времени, когда я вижу, как пользователи устанавливают это свойство, они делают это для побочных эффектов, а не для своего истинного намерения. Эти побочные эффекты исчезли в Visual Studio 2010, потому что вы можете получить нужные эффекты в любом режиме. Но чтобы понять, как все изменилось, давайте сначала рассмотрим некоторую справочную информацию.
Намерение AsyncRendering
Традиционно, HTML веб-страницы не отправляется в браузер, пока все веб-элементов управления на странице не сгенерировали их содержание. Для таких элементов управления, как текстовые поля и кнопки, это имеет смысл. Но ReportViewer намного сложнее, чем это. Это может заставить зрителя долгое время генерировать HTML для отчета. В большинстве случаев имеет смысл отправить оставшуюся часть страницы обратно в браузер, а затем сделать другой запрос для получения содержимого отчета асинхронно. Это позволяет пользователю взаимодействовать с остальной частью страницы, а также видеть «индикатор загрузки», чтобы они знали, что сервер что-то делает. Это поведение по умолчанию - AsyncRendering = true.
Но есть также случаи, когда вы хотите заблокировать всю страницу до тех пор, пока отчет не будет обработан. Хорошим примером является тип страницы на панели инструментов, который отображает несколько небольших отчетов, возможно, каждый из которых содержит один график или небольшую таблицу. В этом случае вы можете не захотеть, чтобы пользователь подвергался бомбардировке несколькими индикаторами ожидания. Если вы знаете, что отчеты быстро обрабатываются, блокирование страницы на короткое время может быть лучшим общим опытом. Это намерение AsyncRendering = false.
Асинхронный режим в Visual Studio 2005 и 2008
режим вы выбираете оказывает существенное влияние на HTML, который в конечном счете генерируется. Элемент управления ReportViewer изначально был разработан задолго до появления ASP.Net AJAX. При синхронном представлении отчета HTML для содержимого отчета встроен непосредственно на всю страницу. Но при асинхронном рендеринге ReportViewer использует фрейм. Содержимое фрейма извлекается браузером отдельно от главной страницы, поэтому позволяет видеть основную страницу, пока отчет создается в отдельном запросе веб-серверу.
Рамки лежат в основе всех побочных эффектов AsyncRendering. Использование фреймов приводит к следующим различиям между двумя режимами:
Карта документа видна только в асинхронном режиме, отчасти потому, что она основана на кадрах, обрабатывающих изменение размера относительно области отчета. Поскольку отчет отображается в кадре, а не является частью страницы ASP.Net, на которой размещен просмотрщик, разработчикам не удастся обработать события, возникающие при обработке отчета. Наиболее частая жалоба, которую мы получаем в этой области, заключается в невозможности обработать событие ReportError при рендеринге асинхронно. Размер кадра сложно вычислить и, следовательно, обычно неправильно. Он основан на режиме калибровки зрителя (в процентах или фиксированном размере), высоте панели инструментов и наличии параметров. Это основная причина видеть чрезмерное количество полос прокрутки в средстве просмотра, особенно при использовании режима стандартов или браузеров, отличных от IE. Разработчики часто переключаются на синхронный рендеринг, чтобы облегчить это. Наряду с аналогичной строкой для определения размера кадра является тот факт, что свойство SizeToReportContent игнорируется в асинхронном режиме. Рамка не корректирует свой размер на основе содержимого, поэтому нет простого способа показать произвольный отчет, встроенный в страницу без полос прокрутки, если вы не переключитесь в синхронный режим. Эти побочные эффекты, как правило, имеют более высокий рейтинг с точки зрения требований при создании приложения, чем синхронно. Поэтому неудивительно, что эти проблемы стали движущей силой, на которую выбирают разработчики режима.
История в Visual Studio 2010
Одна из самых больших особенностей ASP.Net ReportViewer в VS 2010 является то, что он в значительной степени опирается на ASP.Net AJAX. По умолчанию зритель будет использовать асинхронные обратные вызовы для всех своих операций. Это означает, что нам больше не нужно полагаться на фреймы для асинхронного извлечения данных отчета с остальной страницы ASP.Net. С VS 2010, как только отчет завершит загрузку, HTML, отображаемый в браузере, будет таким же, независимо от того, используете ли вы синхронный или асинхронный рендеринг.
Все предыдущие побочные эффекты AsyncRendering теперь исчезли. Оба режима поддерживают карту документа. Оба режима поддерживают свойство SizeToReportContent. Асинхронные обратные вызовы обычно обрабатываются так же, как и традиционные обратные вызовы, поэтому вы можете обрабатывать события, возникающие во время обработки отчета. И из-за обширной работы, которую мы внесли в этот выпуск для стандартного режима HTML и Firefox и рендеринга Safari, вы никогда не должны видеть двойные (или тройные!) Полосы прокрутки в средстве просмотра.
С VS 2010 AsyncRendering вернулась к своему истинному намерению - она контролирует, блокирует ли начальная обработка отчета всю страницу ASP.Net, и ничего больше.
Надеюсь, вы сообщили обо всех проблемах, которые возникают у вас в Connect, http://connect.microsoft.com/visualstudio/. –
Да, у меня есть. См. Мое редактирование выше. –
Адриан, я отправил еще один ответ об исходной проблеме на ваш родственный вопрос, поскольку он был более прямым. –