Crystal Reports Viewer с MVC3 - PullRequest
       2

Crystal Reports Viewer с MVC3

9 голосов
/ 06 августа 2011

Я создаю веб-приложение ASP.NET MVC3 и хочу создать несколько отчетов, используя отчеты Crystal Reports, и отображать их с помощью средства просмотра отчетов Crystal. Я искал в Интернете, и я не нашел надежного способа сделать это в веб-приложении MVC3. Есть ли у вас какие-либо намеки / идеи, как это сделать?

Ответы [ 3 ]

5 голосов
/ 08 августа 2011

Если вы не возражаете против взлома, на самом деле это довольно просто.(Предполагая CR4VS2010)

Сначала добавьте страницу веб-форм в свой проект и добавьте в нее элемент управления просмотра отчетов Crystal.

Убедитесь, что добавлены ссылки на:

CrystalDescisions.CrystalReports.Engine,CrystalDescisions.ReportSource, CrystalDescisions.Shared и CrystalDescisions.Web.

Затем добавьте PageRoute в свое приложение, ведущее к новой добавленной странице.

Наконец, и это было самой большой болью ПУСТОЙ,вам нужно будет заставить работать Crystal Image Handler.Есть много предполагаемых способов, как в сети, так и здесь, в SO, но ни один из них на самом деле не работал для меня, поэтому я прибег к обману:

public class CrystalImageHandlerController : Controller
{
    //
    // GET: /CrystalImageHandler.aspx

    public ActionResult Index()
    {
        return Content("");
    }

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {

        var handler = new CrystalDecisions.Web.CrystalImageHandler();
        var app = (HttpApplication)filterContext.RequestContext.HttpContext.GetService(typeof(HttpApplication));
        if (app == null) return;

        handler.ProcessRequest(app.Context);

    }
}

Добавьте маршрут к этому контроллеру как /CrystalReportsImageHandler.aspx, этогде CR ожидает, что это обработчик.Это также может быть использовано в областях, просто измените обработчик и маршруты страниц по мере необходимости.

Помните, что вы не сможете использовать макеты Razor.Поэтому вам нужно прибегнуть к другим средствам, чтобы получить визуальную преемственность.(Я использовал IFrames)

4 голосов
/ 07 марта 2012

В наших проектах мы возвращаем отчет напрямую в формате PDF. Мы решили не использовать и WebForms, и MVC в одном и том же проекте, в основном из-за того, что поддерживали чистоту кодовой базы.

Отчеты создаются на основе «тупого» набора данных, созданного вручную, и с данными, заполненными классом обслуживания, который получает всю информацию, необходимую через NHibernate (поскольку мы используем уровень персистентности ORM и абстракции БД, Crystal Reports должен не подключается напрямую к базе данных).

Если в вашем проекте нет необходимости показывать отчет в браузере в качестве «режима предварительного просмотра», вот пользовательский ActionResult, который я написал для такой ситуации:

public class PdfReportResult : ViewResult
{
  /// <summary>
  /// Crystal Report filename
  /// </summary>
  public string reportFileName { get; set; }

  /// <summary>
  /// DataSet used in the report
  /// </summary>
  public DataSet reportDataSet { get; set; }

  /// <summary>
  /// Report parameters
  /// </summary>
  IDictionary<string, object> parameters { get; set; }

  public PdfReportResult(string reportFileName, DataSet reportDataSet, IDictionary<string, object> parameters)
  {
    if (string.IsNullOrEmpty(reportFileName))
      throw new ArgumentException("Report filename not informed", "reportFileName");

    if (reportDataSet == null)
      throw new ArgumentException("DataSet not informed", "reportDataSet");

    if (parameters == null)
      this.parameters = new Dictionary<string, object>();
    else
      this.parameters = parameters;

    this.reportDataSet = reportDataSet;
    this.reportFileName = reportFileName;
  }

  public PdfReportResult(string reportFileName, DataSet reportDataSet)
    : this(reportFileName, reportDataSet, null)
  { }

  public override void ExecuteResult(ControllerContext context)
  {
    if ( context == null )
      throw new ArgumentNullException("context");

    if ( string.IsNullOrEmpty(this.ViewName) )
      this.ViewName = context.RouteData.GetRequiredString("action");

    // Alias to make the code more legible
    HttpResponseBase response = context.HttpContext.Response;

    // Generating the report
    using ( ReportDocument report = new ReportDocument() )
    {
      // Load the report
      report.Load(context.HttpContext.Server.MapPath("~/Reports/" + reportFileName));

      // Set the dataset
      report.SetDataSource(reportDataSet);

      // Set the parameters (if any)
      foreach (var parameter in parameters)
        report.SetParameterValue(parameter.Key, parameter.Value);

      // Send back the PDF to the user
      using ( MemoryStream oStream = (MemoryStream)report.ExportToStream(ExportFormatType.PortableDocFormat) )
      {
        response.Clear();
        response.Buffer = true;
        response.AddHeader("Content-Disposition", this.ViewName + ".pdf");
        response.ContentType = "application/pdf";
        response.BinaryWrite(oStream.ToArray());
        response.End();
      }
    }
  }
}
2 голосов
/ 01 апреля 2012

Поскольку Crystal Report является серверным элементом управления, нам нужна веб-страница / usercontrol для отображения отчета.И никогда не помещайте этот webform / пользовательский элемент управления в папку представлений в mvc, вы получите сломанные кнопки с 404 в CrViewer.Вы также можете использовать Iframe в виде бритвы для отображения отчета.Ниже приводится рабочая модель [VS2010], пожалуйста, пройдите.

Шаг 1: Настройка Crystal Report 1. Создайте папку верхнего уровня в корневом каталоге сайта.2. Поместите файл Crystal report.rpt в эту папку3. Добавьте веб-страницу (.aspx) в эту папку.Эта страница служит страницей просмотра отчетов.Добавьте элемент управления CrystalReportViewer на этой странице.

div align="center" style="width:100%; height:100%;"
        CR:CrystalReportViewer ID="crViewer" runat="server" AutoDataBind="true"
div

4.После регистрации сборки будет добавлено в верхней части страницы ASPX.

<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>.
  1. Проверьте версию CrystalReportViewer.Для этого выберите «выбрать элементы» из панели инструментов на боковой панели VS.Сравните эту версию с версией CrystalDecisions.Web в верхней части страницы aspx.Если оба одинаковы, оставьте это, иначе измените версию регистрации сборки так же, как в CRViewer.

  2. Перейти к файлу web.config в корневой папке сайта;проверьте сборки, начиная с «CrystalDecisions» под тегом.Измените их версии так же, как в версии CrystalReportViewer (здесь Version = 13.0.2000.0).

Шаг 2: Настройка контроллера, действие и просмотр 1. Добавьте новое действие в класс контроллера отчетов.2. Напишите необходимые шаги для загрузки данных из базы данных / файлов.3. Установите данные в сессию.4. Не добавляйте представление для этого действия.Вместо этого используйте метод Response.Redirect.

  public class ReportController : Controller
  {
  public ActionResult reportView(string id)
  {
  Session["ReportSource"] = GetdataFromDb();
  Response.Redirect("~/Reports/WebForm1.aspx");
  return View();
  }
  }
  1. Добавьте событие загрузки страницы на страницу .aspx.

     protected void Page_Load(object sender, EventArgs e) 
     {
     CrystalDecisions.CrystalReports.Engine.ReportDocument report = 
     new CrystalDecisions.CrystalReports.Engine.ReportDocument();
     report.Load(Server.MapPath("~/Reports/CR_report.rpt"));
     report.SetDataSource(Session["ReportSource"]);
     crViewer.ReportSource =report; 
     }
    

Шаг 3: Небольшой взлом в Global.asax 1. Чтобы избежать «Состояние сеанса создало идентификатор сеанса, но не может сохранить его, поскольку ответ уже был сброшен приложением». ошибка или «вывод страницы пустого отчета» Добавьте следующий код в Global.asax.

  void Session_Start(object sender, EventArgs e)
  {
     string sessionId = Session.SessionID;
  }

Теперь вы можете вызвать действие reportView () в ReportController для отображения отчета Crystal.Хорошего дня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...