web-dev-qa-db-ja.com

MVC5およびSSRS ReportViewer-実装方法?

私はこれを解決するために何時間も費やしてきましたが、これまでのところ、MVC1、MVC2、およびMVC3ベースのソリューションを見つけることができますが、MVC5およびSSRSとReportViewerの使用については何も見つかりません。率直に言って、私がWebFormsを知りません。私が働いている店でMVCが大物だった後、プログラミングの世界に参加したからです。追加の裏話が十分あれば、私はそれに行きます。

私が持っています:

  • ストアドプロシージャを記述
  • VS 2013のビジネスインテリジェンスツールを使用してレポートをデザインした
  • デザイナーでレポートを表示し、それが良いことを知った
  • ReportViewerを私のアプリケーションに統合しようとしましたが、成功しませんでした
  • クエリの呼び出しを再実行する必要があると判断し(レポートのデザインに含まれているにもかかわらず)、これを行うために一連のテスト日付を使用してコードを記述しました。
  • 決定されたWebFormsは、レポートをアプリケーションに表示するために何らかの形で関与しています。

それで、私はthinkというポイントに到達しました。必要なことを実行するには、aspxファイルが必要です。誰かがこれを見て私を助けてくれるなら、あなたは何時間ものストレスから私を癒してくれるでしょう。

最初に、私のRouteConfig.csファイルのスニペット:

routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

私の報告コントローラーコード:

     [HttpPost]
        public ActionResult GetSysWideQuizReport([Bind(Include = "Topic, Date1, Date2")] QuizReporting quizParams)
        {
 ReportViewer ReportViewer1 = new ReportViewer();
            ReportViewer1.ProcessingMode = ProcessingMode.Local;
            ReportViewer1.LocalReport.ReportPath = Request.MapPath(Request.ApplicationPath) + @"Reports\System Quiz Report.rdl";
            ReportDataSource source = new ReportDataSource("DataSet1", QuizData(quizParams));
            ReportViewer1.LocalReport.DataSources.Clear();
            ReportViewer1.LocalReport.DataSources.Add(source);

            return View(ReportViewer1);
        }



private DataTable QuizData(QuizReporting quizParams)
        {

            DataSet ds = new DataSet("DataSet1");

                using(SqlConnection connection = new SqlConnection())
                { 

                connection.ConnectionString = GetConnectionString();

                SqlCommand cmd = new SqlCommand("SystemQuizReport", connection);
                //cmd.CommandText = "EXEC SchoolQuizReport @TopicID, @Date1, @Date2";
                cmd.Parameters.AddWithValue("@TopicID", quizParams.Topic.TopicID);
                cmd.Parameters.AddWithValue("@Date1", "2015/04/13");
                cmd.Parameters.AddWithValue("@Date2", "2015/04/16");
                cmd.CommandType = CommandType.StoredProcedure;

                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;
                da.Fill(ds);
                return ds.Tables[0];
                }

        }

        static private string GetConnectionString()
    {
        return "Data Source=(localdb)\\v11.0; Initial Catalog=UCAPDB-20140822124213; Integrated Security=True;";
    }

そして、私の「表示」(本当にaspx)コード:

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="600">
    </rsweb:ReportViewer>
    </form>
</body>
</html>

私の現在のエラーは:

'〜/ Views/Reporting/GetSysWideQuizReport.aspx'のビューは、ViewPage、ViewPage、ViewUserControl、またはViewUserControlから派生する必要があります。

更新

私は以下の提案ソリューションを試してみましたが、どうやらかなり失敗しました。そこで私は続けて、RDLをRDLCに変換し、デザインウィザードを使用してASPXページのReportViewerに呼び出しを挿入しました。今、私は奇妙なAJAXエラーの完全なスルーを取得しています。

更新されたGetSysWideQuizReport.aspx:

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Page language="C#" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Quiz Report</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="915px" Height ="1000px" Font-Names="Lato" Font-Size="10pt" ShowBackButton="False" ShowRefreshButton="False" WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt">
        <LocalReport ReportPath="ReportViews\System Quiz Report.rdlc">
            <DataSources>
                <rsweb:ReportDataSource DataSourceId="LocalDb" Name="DataSet1" />
            </DataSources>
        </LocalReport>
    </rsweb:ReportViewer>
        <asp:SqlDataSource ID="LocalDb" runat="server" ConnectionString="<%$ ConnectionStrings:LocalDb %>" SelectCommand="SystemQuizReport" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:FormParameter FormField="TopicID" Name="TopicID" Type="Int32" />
                <asp:FormParameter DbType="DateTime2" FormField="Date1" Name="Date1" />
                <asp:FormParameter DbType="DateTime2" FormField="Date2" Name="Date2" />
            </SelectParameters>
        </asp:SqlDataSource>
    </form>
</body>
</html>

ユーザーフォームは、このaspxページに直接投稿します。今私のエラーのために:

Uncaught SyntaxError: Unexpected token <    ScriptResource.axd:1 
Uncaught SyntaxError: Unexpected token <    GetSysWideQuizReport.aspx:40
Uncaught Error: ASP.NET Ajax client-side framework failed to load.   ScriptResource.axd:1 
Uncaught SyntaxError: Unexpected token < Reserved.ReportViewerWebControl.axd:1 
Uncaught SyntaxError: Unexpected token < ScriptResource.axd:1 
Uncaught SyntaxError: Unexpected token <    GetSysWideQuizReport.aspx:49
Uncaught ReferenceError: Sys is not defined GetSysWideQuizReport.aspx:114 
Uncaught ReferenceError: Sys is not defined GetSysWideQuizReport.aspx:55 
Uncaught ReferenceError: $get is not defined
9
Dreamcasting

aSPXページを使用する必要があります。MVCアプリケーションのルートの下に新しいフォルダー(例:WebForms)を追加し、その中に新しいASPX Webフォームを追加するだけです。

aspxページで、reportviewerを追加できます

<rsweb:ReportViewer ID="reportViewer" runat="server" Width="100%" Height="800" CssClass="reportViewer" ShowPrintButton="False"> </rsweb:ReportViewer>

aspxページのコードビハインド

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (!string.IsNullOrEmpty(Request.QueryString["ReportFolder"]))
            {
                string reportpath = HttpUtility.HtmlDecode(Request.QueryString["ReportFolder"]);
                int aantalKeys = Request.Params.AllKeys.Length;

                List<ReportParameter> parameters = new List<ReportParameter>();
                for (int i = 1; i < aantalKeys; i++)
                {

                    string value = Request.Params[i];
                    string key = Request.Params.Keys[i];
                    if (key.Contains("_RAP"))
                    {
                        int index = key.IndexOf('_');
                        key = key.Substring(0, index);
                        ReportParameter parameter = new ReportParameter(key, HttpUtility.HtmlDecode(value));
                        parameters.Add(parameter);
                    }
                }
                this.RenderReport(reportpath, parameters);
            }

        }

    }

    private void RenderReport(string reportpath, List<ReportParameter> parameters = null)
    {
        string User = [ReportserverUser];
        string Pass = [ReportserverPass];
        string ReportServerUrl = [ResportserverUrl]];
        IReportServerCredentials irsc = new CustomReportCredentials(User, Pass, "");
        Uri uri = new Uri(ReportServerUrl);
        int lastSegment = uri.Segments.Length - 1;
        string page = uri.Segments[lastSegment];

        // EVENTS
        //reportViewer.Load += reportViewer_Load;
        //reportViewer.Unload += reportViewer_Unload;

        reportViewer.Visible = true;
        reportViewer.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
        reportViewer.ServerReport.ReportServerCredentials = irsc;
        reportViewer.ServerReport.ReportServerUrl = new Uri(uri.AbsoluteUri.Replace(page, ""));
        reportViewer.ServerReport.ReportPath = reportpath;
        if (parameters != null && parameters.Count != 0)
        {
            reportViewer.ServerReport.SetParameters(parameters);

        }
        reportViewer.ServerReport.Refresh();
    }

    private Dictionary<string, object> GetCurrentParameters()
    {

        var parameterCollection = reportViewer.ServerReport.GetParameters();


        var param = new Dictionary<string, object>();
        foreach (var p in parameterCollection)
        {
            var name = p.Name;
            if (p.DataType == ParameterDataType.DateTime)
            {
                var d = Convert.ToDateTime(p.Values[0]);
                param[name] = d.ToString("dd-MM-yyyy");
            }
            else
            {
                var values = p.Values.ToList();
                param[name] = values;
            }

        }


        return param;
    }

これを配置すると、 http:// localhost:port/webForms/yourpage.aspx?reportfolder = [reportpath]&param1_RAP = 1&param2_RAP = ogjirewog に移動できるはずです。

コードビハインドで次のパラメーターを提供する必要があります-ReportserverUser&ReportserverPass:reportserverインターフェイスにログインしてレポートにアクセスできる資格情報。 -レポートサーバーのURL:これはレポートサーバーのAsxm WebサービスへのURLです。-レポートパス:レポートサーバーのレポートへのパス(名前のみ、末尾に拡張子なし)

4
Gelootn