Nub*_*cus 5 c# asp.net-mvc rdlc reporting-services asp.net-mvc-4
我是ASP.Net MVC的新手.我要求在MVC中显示基于RDLC的报告.
基本上我的要求以及我所做的是: -
我有一个继承APIController的ReportController,它有一个返回DataSet的方法.此DataSet正被发送到RDLC文件.
为此,我已完成以下操作,但无法使报告生效.
我创建了一个名为ReportParameter的模型类,如下所示:
public class ReportParameter
{
public DateTime DateFrom { get; set; }
public DateTime DateTo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有以下控制器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();
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个API Controller ReportController,其对象已在上面的ReportViewerController中创建,以生成DataSet并填充RDLC报告.API控制器是:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个视图GenerateReport.aspx和ViewReport.aspx.GenerateReport.aspx如下:
<table style="width: 40%;">
<tr>
<td class="style1">
<h3>
<asp:Label ID="Label1" runat="server" Text="From Date"></asp:Label></h3>
</td>
<td>
<%=@Html.EditorFor(a=> a.DateFrom, new{id="startDate",style="width:250px;"}) %>
<%=@Html.ValidationMessageFor(a => a.DateFrom)%>
</td>
</tr>
<tr>
<td class="style1">
<h3>
<asp:Label ID="Label2" runat="server" Text="To Date"></asp:Label></h3>
</td>
<td>
<%=@Html.EditorFor(a => a.DateTo, new { id = "ToDate", style = "width: 250px;" })%>
<%=@Html.ValidationMessageFor(a => a.DateTo)%>
</td>
</tr>
<tr>
<td class="style1">
</td>
<td>
</td>
</tr>
<tr>
<td class="style1">
</td>
<td>
<input id="btnsearch" class="button" type="submit" value="Show" />
</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
ViewReport.aspx如下:
<center style="width: 974px">
<iframe id="myReport" width="100%" height="450px" src="ReportViewer.aspx">
</iframe></center>
Run Code Online (Sandbox Code Playgroud)
我添加了一个Dataset.xsd,一个rdlc文件和一个aspx页面来添加rdlc文件.
但我不能让它发挥作用.如何显示报告,或如何将从Controller收到的数据集填充到报告中?
背景
(我知道你知道这一点,但对于未来的读者;-)
Session状态在MVC和WebForms之间共享.详细信息用于在MVC视图中呈现ReportViewer控件
的ViewReport.aspx页面iframe需要是一个很好的老式asp.Net Web表单.
对于小型数据集,您可以在MVC控制器中获取报告数据,然后将其传递Session给WebForm.
但是,对于较大的数据集,我建议您将参数传递给Session中的WebForm(QueryString如果它们不敏感,甚至通过它们),然后后面的WebForm代码需要获取数据集和将它绑定到ReportViewer.
在MVC端,在MyController参数post:
[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();
}
Run Code Online (Sandbox Code Playgroud)
一旦用户在View上输入ReportParameters,您就可以显示IFrame MyController/GenerateReport:
<iframe src='<%= Url.Content("~/OldSkoolAspx/ReportViewer.aspx") %>' width="100%" height="450px"></iframe>
Run Code Online (Sandbox Code Playgroud)
然后将WebForms页面添加/OldSkoolAspx/ReportViewer.aspx到MVC项目中.在后面的代码中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();
}
}
Run Code Online (Sandbox Code Playgroud)
在WebForms ReportViewer.aspx前端,添加控件(建议使用工具箱,以便将所有必需的引用添加到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>
Run Code Online (Sandbox Code Playgroud)
这里有很多活动部件,所以我已经在这里向GitHub上传了一个演示项目
请注意,相同的技术也适用于Report Server生成的报告(即使用带有.RDL报告的ReportViewer).但是要小心RDLC和RDL都可以成为真正的SessionState生猪
| 归档时间: |
|
| 查看次数: |
15391 次 |
| 最近记录: |