11

ReportViewerを使用してSSRSからリモートレポートをレンダリングする必要があるMVC4アプリケーションに取り組んでいます。このフォーラムの助けを借りて、MVCでページをレンダリングすることができましたが、コールバックが機能しません(最初のページをロードします)。レポートのエクスポートは正常に機能します(すべてのページが表示されます)。ページを調べたところ、ページを変更した後、次のエラーに気づきました。

Uncaught Sys.WebForms.PageRequestManagerParserErrorException:Sys.WebForms.PageRequestManagerParserErrorException:サーバーから受信したメッセージを解析できませんでした。

MVCとWebフォームの組み合わせに関するこの記事を見つけましたが、マスターレイアウトページがなくなったため、古くなっているように見えます。これは、asp.net mvc 3かみそりビューでreportviewerコントロールを使用するにはどうすればよいですか?その記事はローカルレポートのみを対象としているためです。AsyncRenderingをtrueとfalseに変更してみました。trueの場合、まったくロードされません。任意の提案をいただければ幸いです。

更新:AsyncRenderingの動作は、以前のバージョンのVisualStudio間で変更されたようです。

4

3 に答える 3

6

結局、許容できないセキュリティリスクのために、元の回答とコールバック基準の両方を捨てなければならなくなりました。私の場合、レポートをHTMLとしてバイト配列にレンダリングし、そこからFileContentResultにレンダリングするコントローラーコードを記述しました。MVCは静的なHTMLページとしてレンダリングするのに十分親切でした。PDF、Excel、またはその他のオプションとしてのエクスポートは、最終的には、RenderパラメーターをHTML4.0から適切なもの(PDF、XLS)およびMIMEタイプに変更することにより、同様の方法で実装されます。このアプローチは、SQLServer2008R2以降で機能します。以前のバージョンのSQLServerでは試していません。

[OutputCache(Duration = 120, VaryByParam = "id")]
public ActionResult ExportHTML(int id)
{
    // we need to add code to check the user's access to the preliminary report.
    // Also need to consolidate code between ExportHTML and ExportPDF.
    var userid = <userid>;
    var password = <password>;
    var domain = <domain>;
    IReportServerCredentials irsc = new myApp.Models.CustomReportCredentials(userid,
        password, domain);
    var parametersCollection = new List<ReportParameter>();
    parametersCollection.Add(new ReportParameter("Snapshot", id.ToString(), false));
    ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer();
    rv.ProcessingMode = ProcessingMode.Remote;
    rv.ServerReport.ReportServerCredentials = irsc;
    rv.ServerReport.ReportPath = <reportpath>;
    rv.ServerReport.ReportServerUrl = new Uri("http://localhost/ReportServer");
    rv.ServerReport.SetParameters(parametersCollection);

    rv.ServerReport.Refresh();
    byte[] streamBytes = null;
    string mimeType = "";
    string encoding = "";
    string filenameExtension = "";
    string[] streamids = null;
    Warning[] warnings = null;

    streamBytes = rv.ServerReport.Render("HTML4.0", null, out mimeType, out encoding,
                                         out filenameExtension, out stream ids,
                                         out warnings);
    var HTMLReport = File(streamBytes, "text/html");
    return HTMLReport;
}
于 2013-03-26T19:29:49.533 に答える
0

私はまだより良い答えを望んでいますが、それまでの間、私の解決策は基準を満たしているようです。これはKendoWebウィンドウを利用します(したがって、理論的にはjQueryを使用して独自のウィンドウを作成できると思います)。パラメータを渡すようにまだ変更していませんが、これは始まりです。また、リダイレクトアクションを保護していないため、現在、ユーザーはソースを表示し、jQueryロードからURLを取得し、そのアドレスに移動して、そこから基になるレポートURLを取得することができます。これをChildActionOnlyとしてマークするか、アクションが自分のウィンドウでのみ使用可能であることを保証するその他の手段を検討します。また、レポートをHTML4.0にレンダリングして、FileResultに詰め込み、その方法でコンテンツをロードできることもわかりました。ただし、レポートは静的HTMLです。

意見:

    @(Html.Kendo().Grid(Model)
    .Name("IndexGrid")
    .Columns(col => 
    {
        col.Bound(c => c.SchoolYear);
        col.Bound(c => c.SubmissionTypeDesc);
        col.Bound(c => c.EntityDesc);
        col.Bound(c => c.SubmissionDate);
        col.Bound(c => c.UserName);
        col.Bound(c => c.Certified);
        col.Command(c => 
            {
                c.Custom("Edit")
                    .Text("View")
                    .Action("Edit", "Draft");
                c.Custom("Preview")
                    .Click("windowOpen");
                c.Custom("Certify")
                    .Action("Certify", "Draft");
                c.Custom("Download")
                    .Action("DumpExcel", "Draft");
            }
            ).Title("<b>Actions</b>")
            .HtmlAttributes(new { style = "width:200px;" });
    })
    .DataSource(ds => ds.Server()
        .Model(model => model.Id(pk => pk.snapshot_id))
        )
    .Sortable(sort => sort.Enabled(true).SortMode(GridSortMode.MultipleColumn).AllowUnsort(true))
    .Reorderable(reorder => reorder.Columns(true))
    .Groupable(group => group.Enabled(true))
    )
</article>

@(Html.Kendo().Window()
      .Name("window") //The name of the window is mandatory. It specifies the "id" attribute of the widget.
      .Title("Preliminary Report") //set the title of the window
      .LoadContentFrom("Redir", "Reports") //define the Action and Controller name
      .Visible(false)
      .Iframe(true)
      .Resizable()
      .Width(750)
      .Height(500)
      .Scrollable(false)
      .Draggable()
          .Actions(a =>
          {
              a.Refresh();
              a.Minimize();
              a.Maximize();
              a.Close();
          })

)
<script>
    function windowOpen(e) {
        e.preventDefault();
        var window = $("#window").data("kendoWindow");
        window.open();
    }
</script>

ReportControllerスニペット:

public ActionResult Redir()
{
    return RedirectPermanent("../ASPReports/ReportForm.aspx");
}

ReportForm.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="~/ASPReports/ReportForm.aspx.cs" Inherits="MyApp.Reports.ReportForm"%>

<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="reportForm" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <rsweb:ReportViewer ID="mainReportViewer" runat="server"  SizeToReportContent="true">
        </rsweb:ReportViewer>
    </div>
    </form>
</body>
</html>

ReportForm.aspx.cs(コードビハインド):

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // credentials - could pull from config
        var userid = ""; 
        var password = "";
        var domain = "";

        IReportServerCredentials irsc = new CustomReportCredentials(userid, password, domain);
        mainReportViewer.ServerReport.ReportServerCredentials = irsc;

        //mainReportViewer.ServerReport.ReportServerUrl =
        //    new Uri(ConfigurationManager.AppSettings["ReportServerUrl"]);
        mainReportViewer.ServerReport.ReportServerUrl =
            new Uri("http://localhost/ReportServer");
        mainReportViewer.ServerReport.ReportPath = "Path";


        mainReportViewer.ProcessingMode = ProcessingMode.Remote;
        mainReportViewer.ShowParameterPrompts = false;
        mainReportViewer.ShowRefreshButton = false;
        mainReportViewer.ShowWaitControlCancelLink = false;
        mainReportViewer.ShowBackButton = false;
        mainReportViewer.ShowCredentialPrompts = false;
        var parametersCollection = new List<ReportParameter>();
        //parametersCollection.Add(new ReportParameter("Snapshot", "##", false));
        mainReportViewer.ServerReport.SetParameters(parametersCollection);
        mainReportViewer.ServerReport.Refresh();
    }
}
于 2013-03-19T18:13:48.837 に答える
-1

IFRAMEを使用するだけです。別のWebサイトまたは仮想ディレクトリを作成し、Webフォームを使用してアプリケーションを作成してから、MVCアプリケーションのIFRAME内にレポートビューアページを表示します。クエリ文字列を使用してレポートパラメータを設定できます。この方法を使用して、レポートビューアをさまざまなシステムに何度も配置しました。

于 2013-03-20T07:46:39.593 に答える