2015-01-01 26 views
5

Jestem całkiem nowy w ASP.Net MVC. Mam wymóg pokazania raportu opartego na RDLC w MVC.Jak mogę używać raportów RDLC z formantem ReportViewer w ASP.Net MVC?

Zasadniczo mój wymóg, jak również to, co zrobiłem to: -

Mam ReportController dziedziczenie APIController, która ma metodę, która zwraca DataSet. Ten zestaw danych jest wysyłany do pliku RDLC.

W tym celu zrobiłem co następuje, ale nie mogłem sprawić, by raport działał.

Stworzyłem klasę modelu o nazwie ReportParameter następująco:

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

Mam następujący kontrolera 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(); 
    } 

} 

mam API Controller ReportController którego obiekt został stworzony w wyżej ReportViewerController, aby wygenerować DataSet i wypełnić raport RDLC. Kontroler API to:

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; 
    } 
} 

Mam dwa widoki GenerateReport.aspx i ViewReport.aspx. GenerateReport.aspx podano poniżej:

<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> 

The ViewReport.aspx podano poniżej:

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

     </iframe></center> 

Dodałem Dataset.xsd, plik RDLC i strony aspx dodać plik RDLC .

Ale nie mogę sprawić, żeby działało. Jak wyświetlić raport lub jak wypełnić zestaw danych, które otrzymuję od kontrolera do raportu?

+1

"WidokReport.aspx" użyty w elemencie iframe musi być staromodnym formularzem internetowym z kodem za - np. ustaw DataSet w kodzie za 'ViewReport.aspx.cs'. Prawdopodobnie możesz przekazać dane z kontrolera MVC za pomocą zmiennej 'Session []'? – StuartLC

+0

Plik ViewReport.aspx nie ma kodu znajdującego się za plikiem. Czy możesz wyjaśnić trochę więcej? – Nubicus

Odpowiedz

5

Tło
(wiem, wiem, ale dla przyszłych czytelników ;-)

  • Microsoft ReportViewer sterowania wymaga viewstate i WebForms ScriptManagers pracować prawidłowo, i jako taki nie nadaje się do bezpośrednie wykorzystanie w widokach MVC.
  • Możliwe jest jednak uruchomienie strony WebForms w projekcie MVC - ponieważ działają one w tym samym AppDomain, stan Session jest dzielony między MVC i WebForms.

szczegółowo
ViewReport.aspx strona wykorzystywane do renderowania kontrolę ReportViewer w iframe na MVC View będzie musiał być dobry staroświecki formularz internetowy asp.Net.

W przypadku małych zestawów danych można pobrać dane raportu w kontrolerze MVC, a następnie przekazać je w postaci Session przez WebForm.

Jednak w przypadku większych zestawów danych zalecam, aby zamiast tego przekazywać parametry do postaci WebForm w sesji (lub nawet za pośrednictwem QueryString, jeśli nie są one wrażliwe), a następnie kod WebForm będzie musiał pobrać zestaw danych i powiązać go z ReportViewer.

Na MVC Side, w poście MyController parametrów:

[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(); 
    } 

Można pokazać iframe Po ReportParameters zostały wpisane przez użytkownika, na widoku MyController/GenerateReport:

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

Następnie dodaj stronę WebForms /OldSkoolAspx/ReportViewer.aspx do swojego projektu MVC. W kodzie za 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(); 
     } 
    } 

A w WebForms ReportViewer.aspx przedni koniec, dodać kontroli (polecam użyć przybornika, więc wszystkie wymagane referencje dodane do pliku web.config):

<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> 

Jest tu wiele ruchomych części, więc dodałem projekt demonstracyjny do GitHub over here

Należy zauważyć, że ta sama technika będzie działać również dla raportów generowanych przez serwer raportów (np. Przy użyciu ReportViewer z raportami .RDL). Należy jednak uważać, aby zarówno RDLC, jak i RDL mogły być rzeczywiste. SessionState hogs

+0

Dzięki @StuartLC, zrobiłeś mój dzień. Przez chwilę drapałem się po głowie, żeby pokazać raport. – Nubicus

+0

Cześć, ale chodzi o to, że kiedy mój raport ładuje się, inna funkcjonalność jest zablokowana, nawet gdy próbowałem asnycrender do prawdziwej bt, wszystkie funkcjonalności działają tylko po tym, jak raport jest całkowicie załadowany jakąkolwiek wskazówką na to? –

+0

Człowieku, pomógł mi się świetnie. :) – ksg