Estoy construyendo una aplicación web ASP.NET MVC3 y quiero crear algunos informes utilizando informes de cristal y mostrarlos mediante el visor de informes de cristal. Busqué en la web y no encontré ninguna forma sólida de hacerlo en una aplicación web MVC3. ¿Tiene alguna sugerencia/idea de cómo hacerlo?Crystal Reports Viewer con MVC3
Respuesta
Si no te importa hackear, en realidad es bastante fácil. (Asumiendo CR4VS2010)
Primero agregue una página de WebForms a su proyecto y agregue el control del visor de informes de cristal a ella.
verificarlo añadido referencias a las:
CrystalDescisions.CrystalReports.Engine
, CrystalDescisions.ReportSource
, CrystalDescisions.Shared
, y CrystalDescisions.Web
.
A continuación, agregue un PageRoute a su aplicación que conduce a la página recién agregada.
Por último, y este fue el mayor dolor en BLANCO, tendrá que hacer que Crystal's Image Handler funcione. Hay muchas maneras de supuestos, tanto alrededor de la red y aquí en SO, ninguno de ellos realmente trabajó para mí, así que recurrí a engaño:
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);
}
}
añadir una ruta a este controlador como /CrystalReportsImageHandler.aspx, aquí es donde CR espera que sea controlador. Esto también se puede usar en Áreas, simplemente cambie las rutas del navegador y de la página según sea necesario.
Tenga en cuenta que no podrá usar sus diseños Razor. Por lo tanto, deberá recurrir a otros medios para obtener continuidad visual. (Utilicé IFrames)
En nuestros proyectos estamos devolviendo el informe directamente en formato PDF. Decidimos no usar ambos WebForms y MVC en el mismo proyecto, principalmente debido a mantener la base de código limpia.
Los informes se generan contra un conjunto de datos "tonto" creado manualmente y con datos llenos por una clase de servicio que retiró toda la información necesaria a través de NHibernate (porque estamos usando una capa de persistencia ORM y abstracción de base de datos, Crystal Reports no debe conectarse directamente a la base de datos).
Si el proyecto no tiene la necesidad de mostrar el informe en el navegador como un "modo de vista previa", aquí está el ActionResult a medida que escribí para este tipo de situación:
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();
}
}
}
}
Desde el informe de cristal es un control de servidor, necesitamos una página web/usercontrol para mostrar el informe. Y nunca coloque este formulario web/control de usuario dentro de la carpeta de vistas en mvc, obtendrá los botones rotos con 404 en CrViewer. También puede usar un Iframe en una vista de maquinilla para visualizar el informe. A continuación se muestra un modelo de trabajo [VS2010], por favor revise.
Paso 1: Configuración de Crystal Report
1. Crear carpeta de nivel superior en el directorio raíz del sitio web.
2. Ponga su archivo Crystal report.rpt en esta carpeta
3. Agregue una página web (.aspx) a esta carpeta. Esta página sirve como página de visor de informes. Agregue un control CrystalReportViewer en esta página.se añadirá
div align="center" style="width:100%; height:100%;"
CR:CrystalReportViewer ID="crViewer" runat="server" AutoDataBind="true"
div
4. Tras el registro de montaje en la parte superior de la página aspx.
<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" Namespace="CrystalDecisions.Web" TagPrefix="CR" %>.
comprobar la versión de CrystalReportViewer. Para esto, seleccione "elegir elementos" de Toolbox en VS Sidebar. Compare esta versión con CrystalDecisions. Versión web en la parte superior de la página aspx. Si ambos son iguales, déjelos; de lo contrario, cambie la versión de registro del ensamblaje de CRViewer.
Vaya al archivo web.config debajo de la carpeta raíz del sitio web; compruebe los ensamblajes que comienzan con 'CrystalDecisions' debajo de la etiqueta. Cambie sus versiones igual que en la versión CrystalReportViewer (aquí Version = 13.0.2000.0).
Paso 2: Configuración del controlador, Acción & Ver
1. Añadir una nueva acción en la clase controlador informe.
2. Escriba los pasos necesarios para cargar datos desde la base de datos/archivos.
3. Establezca los datos en Session.
4. No agregue vista para esta acción. En su lugar, use el método Response.Redirect.
public class ReportController : Controller
{
public ActionResult reportView(string id)
{
Session["ReportSource"] = GetdataFromDb();
Response.Redirect("~/Reports/WebForm1.aspx");
return View();
}
}
Añadir evento de carga de la página a la página .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; }
Paso 3: pequeño programa en Global.asax
1. Para evitar “estado de sesión ha creado un identificador de sesión, pero no se puede salvar porque la respuesta ya se inundó por el aplicación. " error o " salida de página de informe de cristal en blanco " agregue el siguiente código en Global.asax.
void Session_Start(object sender, EventArgs e)
{
string sessionId = Session.SessionID;
}
Ahora puede llamar a la acción reportView() en ReportController para visualizar el informe cristalino.
¡Que tengas un buen día!
- 1. Crystal Reports en MVC
- 2. Crystal Reports localizados
- 3. ¿Cómo usar Crystal Reports con ASP.NET?
- 4. ¿Cómo enlazar Crystal Reports con Entity Framework?
- 5. Crystal Reports Failed Database Login
- 6. ¿Buen libro para Crystal Reports?
- 7. Mostrar RichText en Crystal Reports
- 8. Crystal Reports estropear texto enriquecido
- 9. Crystal Reports en ASP.NET MVC
- 10. Business-Objects vs Crystal Reports
- 11. Tablas pivotantes en Crystal Reports?
- 12. Crystal Reports Viewer no irá más allá de la página 2
- 13. Crystal Reports: ¿es una buena idea compilar mi proyecto utilizando la versión log4net.dll de Crystal Reports?
- 14. Crystal Reports Images y ASP.Net MVC
- 15. ¿Está almacenando Crystal Reports en archivos XML?
- 16. Crystal Reports - Facilitando la impresión frontal/posterior
- 17. ¿Cómo funciona Crystal Reports Runtime Licensing?
- 18. Invertir Ingeniería Crystal Reports Definición de archivos
- 19. Alineación de texto vertical en Crystal Reports?
- 20. Crystal Reports vs ReportViewer Pros/Cons?
- 21. VS2010 Crystal-Reports: "Keycode no válido"
- 22. Crystal Reports recortar texto en PDF
- 23. Cómo insertar imágenes dinámicamente en Crystal Reports
- 24. despliegue de Crystal Reports Asamblea sobre Appharbor
- 25. Crystal Reports para Visual Studio 2010 Error
- 26. Error al utilizar Crystal Reports para .net
- 27. Anidado si no en Crystal Reports
- 28. ¿Puede Crystal Reports ajustar a escala? Página
- 29. ¿Algo como Crystal Reports para PHP?
- 30. Fórmula de Crystal Reports: IsNull + Iif
Gracias. Obtuve la parte Webform de [aquí] (http://www.highoncoding.com/Articles/550_Creating_Crystal_Report_in_ASP_NET.aspx) y al combinarla con su controlador logré ver mi informe. –
¡Genial! También debería activar este tidbit: cuando se usa el visor web, tiene una API JS en el navegador. No he encontrado ninguna documentación en él, pero cuando lo hice funcionar con el diseño de mi sitio, usando iframes, descubrí que su método de cambio de tamaño era invaluable. El nombre de los objetos es _UI. –
Usted menciona: "Agregue una ruta a este controlador como/CrystalReportsImageHandler.aspx". ¿Cómo exactamente hago esto? –