3

Я работаю над проектом ASP.NET MVC 2/.NET 3.5, который включает отчеты SSRS 2008. После перехода на VS 2010 RC, новый просмотрщик отчетов о веб-формах так много беспокоит, что я снова хочу использовать старый просмотрщик отчетов из VS 2008. Теперь мне просто интересно, что было бы самым простым способом сделать это.Как использовать SSRS ReportViewer из VS 2008 в проекте VS2010?

Средство просмотра отчетов встроено в файл ASPX Webforms, который загружается в IFrame по представлению MVC. Параметры отчета в настоящее время хранятся как переменные сеанса, и по соображениям безопасности я бы предпочел не изменять это для параметров HTTP POST или GET. Поэтому я не могу просто разместить средство просмотра отчетов в отдельном приложении и построить его с помощью VS2008.

Перемещение всего проекта на VS 2008 не является вариантом.

Итак, какой самый простой способ использовать VS 2008 ReportViewer в VS 2010? Есть ли способ захватить сборку VS VS 2008 и использовать ее в моем проекте?

Спасибо,

Адриан

Edit: проблемы, которые я имею с версией VS2010 в ReportViewer связаны с AJAX запросов. Например, AsyncRendering=True fails to load the report и using the paging controls or the reload button does not work either. Кнопка экспорта работает нормально, но это связано с тем, что она не связана с запросами AJAX.

Если у вас есть идеи, как я могу это исправить, я бы предпочел сохранить новый просмотрщик отчетов. Это просто I have previously asked about this on SO, на social.msdn.com и на MS Connect и пока не нашли ответа.

+0

Надеюсь, вы сообщили обо всех проблемах, которые возникают у вас в Connect, http://connect.microsoft.com/visualstudio/. –

+0

Да, у меня есть. См. Мое редактирование выше. –

+0

Адриан, я отправил еще один ответ об исходной проблеме на ваш родственный вопрос, поскольку он был более прямым. –

ответ

4

У вас есть несколько вариантов в зависимости от проблем, с которыми вы столкнулись. Если одно из этих предложений не сработает для вас, пожалуйста, более подробно расскажите о проблемах, которые у вас есть с элементом управления. Например, возникли ли у вас проблемы с элементом управления в дизайнере, Microsoft изменила его функциональность или API, или это плохо работает во время выполнения?

  • Если проблема с API или поведения во время выполнения просмотра отчетов, и если у вас есть и VS 2008 и VS 2010 установлена, вы можете очень легко удалить ссылку на версию 2010 года (на самом деле версия 10.0) Microsoft.ReportViewer.WebForms в соответствии с вашими проектами. Затем вы можете использовать диалог добавления ссылок, чтобы выбрать версию с 2008 года (на самом деле версия 9.0). Вам также нужно будет обновить каждую страницу, использующую средство просмотра отчетов, и заменить декларацию версии 10 следующим заявлением версии 9.

На каждой странице замены:

<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %> 

С:

<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %> 

И в web.config заменить:

<add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> 
<add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> 

С:

<add assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
<add assembly="Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 

И в сети.конфиг заменить:

<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" /> 

С:

<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/> 

И в web.config заменить:

<add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 

С:

<add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> 
  • Если только дизайнер падает на вас или создает проблемы, вы можете обернуть версию этого элемента управления в пользовательском элементе управления или пользовательском элементе управления и использовать его на своих страницах. У вас все еще не будет очень хороший дизайнерский опыт, но если разработчик - это ваша проблема, это может быть лучшим обходным решением, чтобы избежать сбоев или других проблем.

  • Если вы все еще не можете заставить это работать, вы можете вернуться в VS2008 и завершить версию просмотра отчетов 2008 года в настраиваемом серверном элементе управления. Затем вы можете ссылаться на свой новый элемент управления в своем проекте 2010 года. Опять же, вы потеряете поддержку дизайнера таким образом.

В дополнение к этим шагам, вы должны войти в Microsoft Connect и сообщать проблемы вы испытываете в деталях, так что они могут исправить это, и включить его в RTM в Visual Studio 2010 (или, возможно, патч) ,

+0

Большое спасибо за ваш исчерпывающий ответ. Проблемы, которые возникают с ReportViewer, связаны с запросами AJAX. Я перечислил детали в первом редактировании моего сообщения. Если у вас есть идеи по их устранению, я бы предпочел использовать новый ReportViewer. Но в противном случае я попытаюсь заменить ссылку, как вы предложили. –

3

Брайан Хартман есть блог, посвященный Report Viewer, который охватывает эту самую тему: AsyncRendering and all the Baggage that Comes With It

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, и ничего больше.

Смежные вопросы