2015-01-01 6 views
5

Ich bin ziemlich neu in ASP.Net MVC. Ich habe die Anforderung, einen RDLC-basierten Bericht in MVC anzuzeigen.Wie kann ich RDLC-Berichte mit dem ReportViewer Control in ASP.Net MVC verwenden?

Grundsätzlich meine Forderung als auch, was ich getan habe, ist: -

Ich habe einen ReportController vererben APIController, die eine Methode hat, die ein DataSet zurückgibt. Dieses DataSet wird an die RDLC-Datei gesendet.

Dafür habe ich Folgendes getan, konnte aber den Bericht nicht funktionieren.

Ich habe ein Modell Klasse mit dem Namen Reportparameter wie folgt erstellt:

public class ReportParameter 
{ 
    public DateTime DateFrom { get; set; } 
    public DateTime DateTo { get; set; } 
} 

Ich habe folgende Controller ReportViewController:

public class ReportViewController : Controller 
{ 
    static readonly ReportController ctrl = new ReportController(); 

    public ActionResult GenerateReport() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult GenerateReport(ReportParameterSalesOrder param) 
    { 
     if (ModelState.IsValid) 
     { 
      Helpers.DataLayer dl = new Helpers.DataLayer(); 
      if (param.DateFrom != null) 
      { 
       DateTime DateFrom = Convert.ToDateTime(param.DateFrom); 
       DateTime DateTo = Convert.ToDateTime(param.DateTo); 

       string fdate = DateFrom.ToString("yyyy/MM/dd"); 
       string tdate = DateTo.ToString("yyyy/MM/dd"); 

       Session["ReportSales"] = ctrl.ReportSales(param); 
      } 

      return Redirect(Url.Action("ViewReport", "ReportView")); 
     } 
     return View(); 
    } 
    public ActionResult ViewReport() 
    { 
     return View(); 
    } 

} 

Ich habe eine API-Controller ReportController deren Gegenstand in der oben geschaffen ReportViewerController, um ein DataSet zu generieren und den RDLC-Bericht aufzufüllen. Die API-Controller ist:

public class ReportController : ApiController 
{ 

    static readonly IReportRepository repository = new ReportRepository(); 

    [ActionName("ReportSales")] 
    public DataSet ReportSales(ReportParameterSalesOrder paramSO) 
    { 
     DataSet item = repository.ReportSales(paramSO); 
     if (item == null) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
     return item; 
    } 
} 

Ich habe zwei Ansichten GenerateReport.aspx und ViewReport.aspx. Die GenerateReport.aspx ist unten angegeben:

<table style="width: 40%;"> 
       <tr> 
        <td class="style1"> 
         <h3> 
          <asp:Label ID="Label1" runat="server" Text="From Date"></asp:Label></h3> 
        </td> 
        <td> 
         <%[email protected](a=> a.DateFrom, new{id="startDate",style="width:250px;"}) %> 
         <%[email protected](a => a.DateFrom)%> 
        </td> 
       </tr> 
       <tr> 
        <td class="style1"> 
         <h3> 
          <asp:Label ID="Label2" runat="server" Text="To Date"></asp:Label></h3> 
        </td> 
        <td> 
         <%[email protected](a => a.DateTo, new { id = "ToDate", style = "width: 250px;" })%> 
         <%[email protected](a => a.DateTo)%> 
        </td> 
       </tr> 
       <tr> 
        <td class="style1"> 
         &nbsp; 
        </td> 
        <td> 
         &nbsp; 
        </td> 
       </tr> 
       <tr> 
        <td class="style1"> 
         &nbsp; 
        </td> 
        <td> 
         <input id="btnsearch" class="button" type="submit" value="Show" /> 
        </td> 
       </tr> 
      </table> 

Die ViewReport.aspx ist unten angegeben:

<center style="width: 974px"> 
     <iframe id="myReport" width="100%" height="450px" src="ReportViewer.aspx"> 

     </iframe></center> 

Ich habe eine Dataset.xsd, eine rdlc-Datei und eine aspx Seite hinzugefügt, um die rdlc Datei hinzufügen .

Aber ich kann es nicht funktionieren lassen. Wie zeige ich den Bericht an oder wie fülle ich die Datenmenge, die ich vom Controller erhält, in den Bericht ein?

+1

Der 'ViewReport.aspx', der im' iframe' verwendet wird, muss ein gutes altmodisches Webformular mit Code dahinter sein - z. Setzen Sie das DataSet im Code hinter 'ViewReport.aspx.cs'. Was Sie wahrscheinlich tun können, ist die Weitergabe der Daten vom MVC-Controller über die 'Session [] 'Variable? – StuartLC

+0

Die ViewReport.aspx hat keinen Code hinter der Datei. Können Sie etwas mehr erklären? – Nubicus

Antwort

5

Hintergrund
(Ich weiß, Sie wissen das, aber für zukünftige Leser ;-)

  • Die Microsoft Reportviewer-Steuerelement und Viewstate WebForms ScriptManagers erfordert korrekt zu arbeiten, und als solche nicht geeignet für direkte Verwendung in MVC-Ansichten.
  • Es ist jedoch möglich, eine WebForms-Seite in einem MVC-Projekt auszuführen - da sie in derselben AppDomain ausgeführt werden, wird der Status Session zwischen MVC und WebForms freigegeben.

im Detail
Die ViewReport.aspx Seite verwendet, um das Reportviewer-Steuerelement in den iframe auf der MVC-Ansicht zu machen braucht ein guter altmodischer asp.Net Webformular sein.

Bei kleinen Datensätzen können Sie die Berichtsdaten im MVC Controller abrufen und diese dann in Session an das WebForm übergeben.

Für größere Datenmengen würde ich jedoch empfehlen, dass Sie stattdessen die Parameter an das WebForm in Sitzung übergeben (oder sogar über die QueryString, wenn sie nicht empfindlich sind), und dann den WebForm-Code hinter müssen Holen Sie den Datensatz und binden Sie ihn an den ReportViewer.

Auf der MVC Seite, im MyController Parameter Beitrag:

[HttpPost] 
    public ActionResult GenerateReport(string param1, int param2) 
    { 
     // Obviously you apply the parameters as predicates and hit the real database 
     Session["ReportData"] = FakeDatabaseData; 
     ViewBag.ShowIFrame = true; 
     return View(); 
    } 

Sie das IFrame zeigen können, sobald die ReportParameters vom Benutzer eingetippt wurden, auf der Ansicht, MyController/GenerateReport:

<iframe src='<%= Url.Content("~/OldSkoolAspx/ReportViewer.aspx") %>' width="100%" height="450px"></iframe> 

Fügen Sie dann Ihrem MVC-Projekt eine WebForms-Seite /OldSkoolAspx/ReportViewer.aspx hinzu. In den Code hinter ReportViewer.aspx.cs:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      var reportDataSource = new ReportDataSource 
      { 
       // Must match the DataSource in the RDLC 
       Name = "SomeReportDataSet", 
       Value = Session["ReportData"] 
      }; 
      ReportViewer1.LocalReport.DataSources.Add(reportDataSource); 
      ReportViewer1.DataBind(); 
     } 
    } 

Und in den WebForms ReportViewer.aspx Frontend, fügen Sie die Steuerung (empfehlen die Toolbox verwenden, so dass alle erforderlichen Hinweise auf die web.config hinzugefügt werden):

<rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" Font-Size="8pt" WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" Width="476px"> 
     <LocalReport ReportPath="MyReport.rdlc"> 
     </LocalReport> 
    </rsweb:ReportViewer> 
    <asp:ScriptManager runat="server" ID="SillyPrerequisite"></asp:ScriptManager> 

Es gibt viele bewegliche Teile hier, also habe ich ein Demo-Projekt auf GitHub over here

hochgeladen. Beachten Sie, dass die gleiche Technik auch für Report Server generierte Berichte funktioniert (dh mit ReportViewer mit. RDL-Berichten). Seien Sie jedoch vorsichtig, dass sowohl RDLC als auch RDL real sein können. SessionState hogs

+0

Dank @StuartLC, du hast meinen Tag gemacht. Ich kratzte mich eine Weile am Kopf, um einen Bericht zu zeigen. – Nubicus

+0

Hallo, aber die Sache ist, wenn mein Bericht lädt die andere Funktionalität ist blockiert, auch ich versuchte Asnycrender zu True BT alle Funktionalit? Ten arbeiten erst, nachdem der Bericht alle Anhaltspunkte? –

+0

Mann, es hat mir sehr geholfen. :) – ksg

Verwandte Themen