Кнопки CrystalReportViewer не работают с использованием MVC Framework

Мы используем платформу MVC (выпуск 5) и элемент управления CrystalReportViewer для отображения наших отчетов. Я не могу заставить работать какие-либо кнопки в верхней части средства просмотра отчетов.

Если я работаю с отчетом «HoursSummary». Если я наведу курсор на любую из кнопок в средстве просмотра отчетов в IE, отображаемая ссылка внизу страницы будет «../HoursSummary». Это создает URL-адрес «http://localhost/HoursSummary. Нет контроллера HoursSummary, поэтому я продолжаю получать 404 ошибки.

  • Я считаю, что хочу перенаправить на 'http://localhost/reports/HoursSummary, поскольку у меня есть контроллер отчетов . Если это правильный метод, кто-нибудь знает, какое свойство я должен установить в элементе управления CrystalReportViewer, чтобы это произошло?
  • Есть ли более простой способ справиться с этой ситуацией?

person ben    schedule 30.09.2008    source источник
comment
можете ли вы предвидеть какую-либо причину, по которой это не может быть применено к использованию элемента управления MS reportviewer?   -  person stan4th    schedule 25.02.2009
comment
Я попробовал средство просмотра отчетов MS, но по какой-то причине оно никогда не работало правильно. Однако к этому моменту у меня уже работал Crystal Reports, и я так и не довел его до конца.   -  person ben    schedule 17.12.2009
comment
Обновлено для VS2010 и Crystal Reports 2010: stackoverflow.com/questions/3902195/   -  person ben    schedule 22.10.2010


Ответы (2)


Если это серверный элемент управления, он не будет работать. ASP.NET MVC не использует обратные передачи, поэтому большинство серверных элементов управления веб-форм не работают.

Что вы можете сделать, так это встроить средство просмотра отчетов в iFrame и вывести его в своем представлении MVC. iframe может указывать на страницу за пределами материала MVC, скажем, в подпапке под названием Legacy или что-то в этом роде.

person Ben Scheirman    schedule 30.09.2008

Нам удалось заставить работать средство просмотра отчетов, и мы использовали его в течение последних нескольких месяцев без каких-либо проблем.

  • У нас есть контроллер отчетов, в котором перечислены ссылки на отчеты, которые мы хотим запустить.
  • Щелчок по одной из ссылок вызовет ajax-вызов на серверную часть и вернет частичную страницу, где мы можем заполнить все необходимые параметры.
  • После заполнения параметров отправляем форму в '\reports\Name of Report'.
  • Вернувшись в контроллер отчетов, мы вызываем SQL, возвращаем наши данные, а затем вызываем другое представление под названием «Полный отчет».
  • Представление «Полный отчет» имеет только элемент управления просмотрщиком отчетов Crystal, где он автоматически принимает данные отчета, которые мы передаем ему через ViewData, заполняет отчет, отображает его и отправляет пользователю.

Кажется, все работает отлично.

ОБНОВИТЬ

Я добавил некоторый код и пояснения к шагам, которые я первоначально перечислил выше. Ключевым моментом, который я упустил, был некоторый код, стоящий за окончательным представлением, поэтому он будет работать с Crystal Reports. Код позади минимален, но необходим. Для работы Crystal Reports вам понадобятся следующие файлы:

  • Файл макета.rpt, в котором вы разрабатываете отчет.
  • Файл aspx, содержащий элемент управления отчетами Crystal Reports. Это файл, который будет содержать некоторый код.

Подробная информация о том, как создать представление, которое будет работать с Crystal Reports:

  • Создайте макет отчета с помощью дизайнера Crystal Reports. Полученный файл будет файлом .rpt. Для примера назовем этот файл AllJobsSummaryReportLayout.rpt.
  • При разработке отчета для «Полей базы данных» выберите одну из бизнес-сущностей или DTO, которая содержит результаты, возвращаемые из SQL.
  • Небольшое отступление: в нашей системе есть несколько объектов передачи данных (DTO), которые содержат не более чем скалярные значения и строки, в этих DTO нет интеллекта. Когда контроллер вызывается, он вызывает модель, модель для большинства этих отчетов возвращает список DTO, который мы затем передаем в представление для отображения. Эти DTO не знают, как запрашивать себя, отображать себя, они содержат только фактические значения, возвращаемые из SQL, которые затем визуализируются кем-то другим.
  • После завершения файла макета Crystal Report, AllJobsSummaryReportLayout.rpt, мы проектируем наш контроллер. В контроллере мы принимаем любые параметры, необходимые для запуска отчета, вызываем модель, модель возвращает наш список DTO, как показано в приведенном ниже фрагменте из контроллера:

    var reportViewData = model.AllJobsSummaryQuery(startDate, endDate);
    if (0 != reportViewData.Count())
    {
        var report = new AllJobsSummaryReportLayout();
        report.SetDataSource(reportViewData);
        report.SetParameterValue("startDate", startDate);
        report.SetParameterValue("endDate", endDate);
        ViewData["ReportData"] = report;
        returnView = "AllJobsSummaryView";
    }
    else
        returnView = "noReportView";
    return View(returnView);
    
  • Обратите внимание на пару моментов: мы создаем переменный «отчет», который является типом файла макета Crystal Report, AllJobsSummaryReportLayout.rpt, который мы создали выше.

  • После того, как мы создали переменную «отчет», мы устанавливаем значения источника данных и любые необходимые параметры и связываем элемент в ViewData.

  • Теперь давайте взглянем на AllJobsSummaryView.aspx. В этом файле есть форма со средством просмотра Crystal Reports Viewer и код файла:

<%@ Page Title="All Jobs Summary Report" Language="C#" AutoEventWireup="true" CodeBehind="AllJobsSummaryView.aspx.cs" Inherits="V.Views.Reports.AllJobsSummaryView"%>     
<%@ Register Assembly="CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %> 
<form id="form1" runat="server">
<div>
<a href="/Reports" id="Report"><< Return to Report Main
    Page</a><br />
<CR:CrystalReportViewer ID="ReportViewer" runat="server" AutoDataBind="True" EnableDatabaseLogonPrompt="False"
    EnableParameterPrompt="False" HasCrystalLogo="False" DisplayGroupTree="False" 
    HasDrillUpButton="False" HasToggleGroupTreeButton="False" HasViewList="False" 
    HasSearchButton="False" EnableDrillDown="False" EnableViewState="True" 
    Height="50px" ReportSourceID="CrystalReportSource1" Width="350px" />    
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
    <Report FileName="AllJobsSummaryReportLayout.rpt">
    </Report>
</CR:CrystalReportSource>
</div>
</form>
  • И код файла:

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Web;
     using System.Web.Mvc;
    
     namespace V.Views.Reports
     {
        public partial class AllJobsSummaryView : ViewPage
        {
            protected void Page_Init(object sender, EventArgs e)
            {
                ReportViewer.ReportSource = ViewData["ReportData"];
            }
    
            protected void Page_Unload(object sender, EventArgs e)
            {
                ((AllJobsSummaryReportLayout)ViewData["ReportData"]).Close();
                ((AllJobsSummaryReportLayout)ViewData["ReportData"]).Dispose();
            }
        }
     }
    
  • Page_Unload является ключевым, без него у вас будет ошибка, сгенерированная Crystal Reports «Вы превысили максимальное количество отчетов, установленное вашим администратором».

Этот метод все еще работает в производственной среде уже более двух лет.

person ben    schedule 07.01.2009
comment
Я пытаюсь сделать это, Бен. На последнем шаге вы говорите, что у вас есть представление с CrystalReportViewer. Кажется, я не могу заставить это работать должным образом без кода программной части. Можете ли вы дать более подробную информацию и взглянуть на код вашего представления? - person Craig; 28.04.2009