web-dev-qa-db-ja.com

ASP.net MVCサイトでSSRSレポートを表示する

ASP.net MVCビューにSQL Server Reporting Servicesレポートビューアーコントロールを配置する方法はありますか?そうでない場合...これを達成する最良の方法は何ですか?

50
Dismissile

いいえ、MVCビューではありません。ただし、サーバーコントロールが含まれるWebフォームページをMVCサイトと混在させることはできます。

うーん、いくつかの例を見つけるために「asp.net mvcとwebフォームを混ぜて」グーグルで検索し、グーグルは私が人間かどうか質問しました:)

とにかく、ここにリンクがあります- http://www.packtpub.com/article/mixing-asp.net-webforms-and-asp.net-mvc -そこにいくつかあります。同じ理由で、レポートコントロールというMVCサイトでもこれを実行しました。

16
Mike Hildner

いいえ、ViewStateが必要なため、MVCビューに配置するとReportViewerコントロールは機能しません。古い学校のWebフォームを作成し、代わりにそこにReportViewerを配置する必要があります。

私が取り組んだプロジェクトで使用した解決策は、カスタムルートハンドラーを作成することでした。そのため、URLルーティングを引き続き使用できました。ルートハンドラーは、RouteDataコレクションからレポート名などのパラメーターを取得し、Webフォームのインスタンスを作成し、パブリックプロパティを介してパラメーターを渡します。 WebフォームはこれらをPage_Loadで読み取り、ReportViewerコントロールを構成します。

// Configure a route in Global.asax.cs that is handled by a ReportRouteHandler
routes.Add("ReportRoute", new Route("Reports/{reportName}",
                                    new ReportRouteHandler());

public class ReportRouteHandler : IRouteHandler {
    public IHttpHandler GetHttpHandler(RequestContext requestContext) {
        var reportName = requestContext.RouteData.Values["reportName"] as string;

        var webform = BuildManager
            .CreateInstanceFromVirtualPath("~/Path/To/ReportViewerWebForm.aspx",
                                           typeof(Page)) as ReportViewerWebForm;
        webform.ReportToShow = reportName;
        return webform;
    }
}

もちろん、このアプローチを使用することにした場合、このコードは出発点にすぎません。私が作成したものは、戻る前にユーザー認証とパラメーター検証も行いました。

更新:ASP.NET 4.0を使用している場合、 これのほとんどは自動的に実行できます

14
Brant Bobby

現在、MvcReportViewerヘルパーがあります。 NuGetから取得できます。

GitHubのプロジェクトサイト

NuGetパッケージ

11
Hayu Rahiza

これは少しシンプルで、MVCのビューに適切なものを渡すには少し修正が必要です

public ActionResult Index()
{
    /*Credentials of a user that has access to SSRS*/
    string userid = "UserId";
    string password = "MyPassword";
    string domain = "MyDomain";

    string reportURL="http://ServerName/ReportServer?/ReportsFolder/ReportName&Parameter=UserName&rs:Command=Render&rs:Format=PDF";

    NetworkCredential nwc = new NetworkCredential(userid, password, domain);

    WebClient client = new WebClient();
    client.Credentials = nwc;

    Byte[] pageData = client.DownloadData(reportURL);

    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now);
    Response.BinaryWrite(pageData);
    Response.Flush();
    Response.End();

    //return View();
    }
4
Leon

簡単な解決策は、MVCビューにiframeを追加して、Reporting Services Webサービスから目的のレポートを開くことです。 iframeは、レポートサービスのコンポーネントで完全に機能します。コンポーネントをMVCビューに移動する場合は、iframeのURLに使用されるパラメーターも動的に制御できます(たとえば、ajaxを使用)。

これは機能しますが、Webレポートサービスにサインインする必要があります(iframeはログオンダイアログを開きます)。 IEの場合、これはWindowsログオン資格情報を使用して「自動的に」行われます。

3
Johncl