ASP.net MVCビューにSQL Server Reporting Servicesレポートビューアーコントロールを配置する方法はありますか?そうでない場合...これを達成する最良の方法は何ですか?
いいえ、MVCビューではありません。ただし、サーバーコントロールが含まれるWebフォームページをMVCサイトと混在させることはできます。
うーん、いくつかの例を見つけるために「asp.net mvcとwebフォームを混ぜて」グーグルで検索し、グーグルは私が人間かどうか質問しました:)
とにかく、ここにリンクがあります- http://www.packtpub.com/article/mixing-asp.net-webforms-and-asp.net-mvc -そこにいくつかあります。同じ理由で、レポートコントロールというMVCサイトでもこれを実行しました。
いいえ、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を使用している場合、 これのほとんどは自動的に実行できます !
これは少しシンプルで、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();
}
簡単な解決策は、MVCビューにiframeを追加して、Reporting Services Webサービスから目的のレポートを開くことです。 iframeは、レポートサービスのコンポーネントで完全に機能します。コンポーネントをMVCビューに移動する場合は、iframeのURLに使用されるパラメーターも動的に制御できます(たとえば、ajaxを使用)。
これは機能しますが、Webレポートサービスにサインインする必要があります(iframeはログオンダイアログを開きます)。 IEの場合、これはWindowsログオン資格情報を使用して「自動的に」行われます。