2015-01-01 16 views
5

Tôi khá mới với ASP.Net MVC. Tôi có một yêu cầu để hiển thị một báo cáo dựa trên RDLC trong MVC.Làm thế nào tôi có thể sử dụng báo cáo RDLC với điều khiển ReportViewer trong ASP.Net MVC?

Về cơ bản yêu cầu của tôi cũng như những gì tôi đã làm là: -

Tôi có một ReportController kế thừa APIController, trong đó có một phương thức trả về một DataSet. Số liệu này đang được gửi đến tệp RDLC.

Đối với điều này, tôi đã làm như sau, nhưng không thể làm cho báo cáo hoạt động.

Tôi đã tạo ra một lớp mô hình tên ReportParameter như sau:

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

Tôi có ReportViewController điều khiển sau:

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

} 

Tôi có một API điều khiển ReportController mà đối tượng đã được tạo ra ở trên ReportViewerController để tạo ra một DataSet và điền vào báo cáo RDLC. Bộ điều khiển API là:

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

Tôi có hai chế độ xem GenerateReport.aspx và ViewReport.aspx. Các GenerateReport.aspx được đưa ra dưới đây:

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

các ViewReport.aspx được đưa ra dưới đây:

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

     </iframe></center> 

Tôi đã thêm một Dataset.xsd, một tập tin rdlc và một trang aspx để thêm các tập tin rdlc .

Nhưng tôi không thể làm cho nó hoạt động. Làm cách nào để hiển thị báo cáo hoặc làm cách nào để điền tập dữ liệu mà tôi nhận được từ Bộ điều khiển vào báo cáo?

+1

'ViewReport.aspx' được sử dụng trong' iframe' sẽ cần phải là một biểu mẫu web thời trang cũ có mã phía sau - ví dụ: đặt DataSet trong mã phía sau 'ViewReport.aspx.cs'. Những gì bạn có thể làm là truyền dữ liệu từ Bộ điều khiển MVC qua biến 'Session []'? – StuartLC

+0

ViewReport.aspx không có mã phía sau tệp. Bạn có thể giải thích thêm một chút không? – Nubicus

Trả lời

5

nền
(Tôi biết bạn biết điều này, nhưng đối với độc giả tương lai ;-)

  • Microsoft ReportViewer kiểm soát đòi hỏi ViewState và WebForms ScriptManagers để làm việc một cách chính xác, và như vậy là không phù hợp cho sử dụng trực tiếp trong Chế độ xem MVC.
  • Tuy nhiên, có thể chạy một trang WebForms trong một Dự án MVC - khi chúng chạy trong cùng một AppDomain, trạng thái Session được chia sẻ giữa MVC và WebForms.

Trong Xem chi tiết
Trang ViewReport.aspx dùng để biểu hiện sự kiểm soát ReportViewer trong iframe trên MVC View sẽ cần phải là một mẫu web tốt cũ thời asp.Net.

Đối với các tập dữ liệu nhỏ, bạn có thể tìm nạp dữ liệu báo cáo trong Bộ điều khiển MVC và sau đó chuyển số này vào Session trên WebForm.

Tuy nhiên, đối với các tập dữ liệu lớn hơn, tôi khuyên bạn nên chuyển các tham số qua WebForm trong phiên (hoặc thậm chí thông qua QueryString, nếu chúng không nhạy cảm), và sau đó mã WebForm sẽ cần tìm nạp tập dữ liệu và liên kết nó với ReportViewer.

Trên MVC Side, trong MyController tham số bài:

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

Bạn có thể hiển thị các IFrame khi ReportParameters đã được gõ vào bởi người sử dụng, trên View, MyController/GenerateReport:

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

Sau đó, thêm một trang WebForms /OldSkoolAspx/ReportViewer.aspx vào dự án MVC của bạn. Trong đoạn mã sau 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(); 
     } 
    } 

Và trong WebForms ReportViewer.aspx kết thúc trước, thêm các điều khiển (khuyến cáo sử dụng các hộp công cụ, vì vậy tất cả các tài liệu tham khảo cần thiết được thêm vào 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> 

Có rất nhiều bộ phận chuyển động ở đây, vì vậy tôi đã tải lên một dự án demo tới GitHub over here

Lưu ý rằng kỹ thuật tương tự cũng sẽ hoạt động đối với báo cáo do Máy chủ báo cáo tạo ra (tức là sử dụng ReportViewer với báo cáo .RDL). Tuy nhiên, hãy cảnh giác rằng cả RDLC và RDL có thể là thực tế SessionState hogs

+0

Cảm ơn @StuartLC, bạn đã thực hiện một ngày của tôi. Tôi đã gãi đầu trong một lúc để hiển thị một báo cáo. – Nubicus

+0

Hi nhưng điều là khi báo cáo của tôi tải các chức năng khác bị chặn ngay cả khi tôi đã cố gắng asnycrender để đúng bt tất cả các chức năng làm việc chỉ sau khi báo cáo là hoàn toàn nạp bất kỳ đầu mối cho điều đó? –

+0

Người đàn ông, nó đã giúp tôi trong thời gian lớn. :) – ksg

Các vấn đề liên quan