1

次のように構成された MVC3 環境で ReportViewer をセットアップしようとしています。

<form id="Form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <rsweb:ReportViewer ID="ReportViewer" runat="server" Width="652px" AsyncRendering="true" PageCountMode="Actual" ProcessingMode="Remote" SizeToReportContent="true">
        <ServerReport ReportServerUrl="http://NMBSC-INTERN02/reportserver" ReportPath="/ReportProject/TestReport3" />
    </rsweb:ReportViewer>
</form>

問題は、ページでエラーが発生することです(クロムデバッグツールから)

Uncaught Sys.WebForms.PageRequestManagerParserErrorException: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. ScriptResource.axd:237
Error$create ScriptResource.axd:237
Sys$WebForms$PageRequestManager$_createPageRequestManagerParserError ScriptResource.axd:649
Sys$WebForms$PageRequestManager$_parseDelta ScriptResource.axd:1410
Sys$WebForms$PageRequestManager$_onFormSubmitCompleted ScriptResource.axd:1289
(anonymous function) ScriptResource.axd:47
(anonymous function) ScriptResource.axd:3484
Sys$Net$WebRequest$completed ScriptResource.axd:6364
Sys$Net$XMLHttpExecutor._onReadyStateChange ScriptResource.axd:5984

エラーに関してはかなり調べましたが、常に UpdatePanel を削除することを指していますが、持っていません。iFrame に部分ビュー全体 (上記) がありますが、IFrame にあるかどうかに関係なくエラーが発生します。他のソリューションでは Server.Transfer と Response.Write の呼び出しについて話していますが、これは私のコードではありません (ReportViewer コントロールによって生成されたものです)。構成で何か間違ったことをしているだけだと思います。

リモート処理モードを機能させるために欠けているものはありますか? ローカルでこれを行うことができますが、リモート処理モードを機能させることができれば、現在取り組んでいるプロジェクトに最適だと思われます。

ノート

非同期モードをオフにすると、レポートが正しく読み込まれることに注意してください。問題は、ツールバーのナビゲーション ボタン (次、最初、最後、前) が機能せず、厄介なことに、AsyncRendering がオンになっている場合と同じエラーがスローされることです。

4

1 に答える 1

2

ReportViewer は、サーバー側のコントロールであるため、既定では MVC では動作しません。そのため、プロセスを調整する必要がありました。

これには、ユーザーがレポート パラメーターを変更できるように入力を含む親ビューと、実際のレポートである親内でレンダリングされる部分ビューの 2 つのビューが含まれます。ユーザーが現在のパラメーターを送信するたびに、ajax 呼び出しを使用してコントローラーからパーシャルを取得し、結果のビューをページに配置して、レポートを更新します。

まず、親のアクション:

public ActionResult MyReport()
{
    return View();
}

次に、親のビュー:

<div>
    <div>

      <!-- input elements go here -->
      <input type="button" value='Update'/>
    </div>
    <div id="ReportPartial"></div>
</div>

<script type="text\javascript">
    $(document).ready(function(){
        $("input[type=button]").click(function(e){
            $.get("/Report/MyReportPartial", "put data from the input elements here", function(serverData){
                $("#ReportPartial").html(serverData);
            });
        });
    });

</script>

ここで、部分ビューを返すコントローラー アクションをセットアップします。コントローラー アクションには、レポートと同じパラメーターがあります。

public ActionResult MyReportPartial(report parameters go here)
{

    //set ViewBag properties here to the report parameters.
    //Normally, I do not advise using the ViewBag, but I used it in this instance to
    //get it working in the aspx page.

    return PartialView("ReportViewPartial", null);
}

最後に、パーシャルは aspx ページです。

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<%@ Register TagPrefix="rsweb" Namespace="Microsoft.Reporting.WebForms" Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %>

<form Id="Form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<rsweb:ReportViewer ID="ReportViewer1" runat="server" 
ProcessingMode="Remote" SizeToReportContent="True" ShowBackButton="False" 
ShowFindControls="False" ShowPageNavigationControls="False" 
ShowZoomControl="False" AsyncRendering="False" ShowRefreshButton="False" ShowExportControls="False" Height="500" Width="500">
</rsweb:ReportViewer>
</form>

<script runat="server">
void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;
    ReportViewer1.ProcessingMode = ProcessingMode.Remote;
    ReportViewer1.ServerReport.ReportServerUrl = new Uri(ConfigurationManager.AppSettings["ReportServerUrl"]);
    ReportViewer1.ServerReport.ReportPath = ConfigurationManager.AppSettings["ReportPath"];
    var rptParameters = new List<ReportParameter>
                            {
                                //Add report parameters here from the ViewBag
                            };

    ReportViewer1.ServerReport.SetParameters(rptParameters);
    ReportViewer1.ServerReport.Refresh();
}
</script>
<script type="text/javascript">
    //the report is hidden when loaded. Using the following jQuery to show it.
    $(document).ready(function () {
        var div = $("#ReportPartial").find("div[id*='_ReportControl']");
        div.show();
        div.find("div:first").show();
    });
</script>

これで、ユーザーが送信するたびに、レポートを含む aspx ページを ajax で読み込み、本質的に更新するように設定されました。レポート コントロールの一部の機能が失われますが、クライアントが必要としていたものには機能しました。

于 2013-03-11T20:04:56.777 に答える