2016-06-20 8 views
1

次のコード(Render Partial)HTMLメソッドを使用して、複数のPower Biレポートを自分のWebページにレンダリングしています。Power Bi:単一のHTMLページでレンダリングするレポート

デバッグした後、私は、コードがそれぞれ異なるID、埋め込みURL、およびそれぞれのレポートのURLを格納した結果で正常に動作していることを発見しました。 しかし、Webページにロードした後、Power Bi loading Symbolを取得した後、すべてのタイルに最後のレポートが表示されます。タイルは別のレポートを表示していますが、タイルは異なるレポートを表示していません。

コントローラー:ここ

コード(コードがすべて異なるレポートを保存すると正常に動作している)、しかし、とき、Webページ上のパワーバイエンジン負荷で、私はすべてのタイルで唯一の最後のレポートを取得します:

public class TelemetryController : Controller 
{ 
    private string workspaceCollection; 
    private Guid workspaceId; 
    private string signingKey; 
    private string apiUrl; 
    public TelemetryReports telemetryreport; 

    public TelemetryController() 
    { 
     this.workspaceCollection = ConfigurationManager.AppSettings["powerbi:WorkspaceCollection"]; 
     this.workspaceId = Guid.Parse(ConfigurationManager.AppSettings["powerbi:WorkspaceId"]); 
     this.signingKey = ConfigurationManager.AppSettings["powerbi:SigningKey"]; 
     this.apiUrl = ConfigurationManager.AppSettings["powerbi:ApiUrl"]; 
    } 
    // GET: Telemetry 


    public ActionResult TelemetryIndex() 
    { 
     var authResponse = new SecurityHelper().Authenticate(new AuthenticateRequest() { IsNonMRT = false, isOnLoad = true }); 
     telemetryreport = new TelemetryReports(); 

     if (!authResponse.IsAuthenticated) 
      throw new NotAuthorizedException((String.Format(ResourceMessages.GetErrorMessage("REW_ERR_0005"), authResponse.context.LoggedInAlias)) + ";" + ((int)PAFEventID.REW_ERR_0005).ToString()); 
     var devToken = PowerBIToken.CreateDevToken(this.workspaceCollection, this.workspaceId.ToString()); 
     using (var client = this.CreatePowerBIClient(devToken)) 
     { 
      var reportsResponse = client.Reports.GetReports(this.workspaceCollection, this.workspaceId.ToString()); 

      foreach (var item in reportsResponse.Value) 
      { 
       var embedToken = PowerBIToken.CreateReportEmbedToken(this.workspaceCollection, this.workspaceId.ToString(), Guid.Parse(item.Id).ToString()); 
       TelemetryReports.ReportViewModel _report = new TelemetryReports.ReportViewModel() 
       { 
        Report = item, 
        AccessToken = embedToken.Generate(this.signingKey) 
       }; 
       telemetryreport.Reports.Add(_report); 
      } 
     } 
     return View(telemetryreport); 
    } 

    [ChildActionOnly] 
    public ActionResult Reports() 
    { 
     var devToken = PowerBIToken.CreateDevToken(this.workspaceCollection, this.workspaceId.ToString()); 
     using (var client = this.CreatePowerBIClient(devToken)) 
     { 
      var reportsResponse = client.Reports.GetReports(this.workspaceCollection, this.workspaceId.ToString()); 

      var viewModel = new TelemetryReports.ReportsViewModel 
      { 
       Reports = reportsResponse.Value.ToList() 
      }; 

      return PartialView(viewModel); 
     } 
    } 

    public async Task<ActionResult> Report(string reportId) 
    { 
     var devToken = PowerBIToken.CreateDevToken(this.workspaceCollection, this.workspaceId.ToString()); 
     using (var client = this.CreatePowerBIClient(devToken)) 
     { 
      var reportsResponse = await client.Reports.GetReportsAsync(this.workspaceCollection, this.workspaceId.ToString()); 
      var report = reportsResponse.Value.FirstOrDefault(r => r.Id == reportId); 
      var embedToken = PowerBIToken.CreateReportEmbedToken(this.workspaceCollection, this.workspaceId.ToString(), report.Id); 

      var viewModel = new TelemetryReports.ReportViewModel 
      { 
       Report = report, 
       AccessToken = embedToken.Generate(this.signingKey) 
      }; 

      return View(viewModel); 
     } 
    } 


    private IPowerBIClient CreatePowerBIClient(PowerBIToken token) 
    { 
     var jwt = token.Generate(signingKey); 
     var credentials = new TokenCredentials(jwt, "AppToken"); 
     var client = new PowerBIClient(credentials) 
     { 
      BaseUri = new Uri(apiUrl) 
     }; 

     return client; 
    } 
} 

TelemetryReport.cs

public class TelemetryReports 
     { 
      public TelemetryReports() { 
       Reports = new List<ReportViewModel>(); 
      } 
      public List<ReportViewModel> Reports { get; set; } 

     public class ReportsViewModel 
     { 
      public List<Report> Reports { get; set; } 
     } 

     public class ReportViewModel 
     { 
      public IReport Report { get; set; } 

      public string AccessToken { get; set; } 
     } 
    } 
    public class TelemetryReport 
    { 
     public IReport Report { get; set; } 

     public string AccessToken { get; set; } 
    } 
(包みデバッグに必要)

のindex.htmlファイル

<!DOCTYPE html> 
    <html lang="en"> 
    <head> 
     @Styles.Render("~/Content/telemetry") 

     @{ 
      Layout = null; 
     } 
     @model TelemetryReports 
     <script type="text/javascript" src="/js/app.js"></script> 
     <script src="~/Scripts/app/powerbi.js"></script> 
     <script src="~/Scripts/lib/chart.js"></script> 
     <script src="~/Scripts/lib/jquery-1.10.2.min.js"></script> 
     <script src="~/Scripts/lib/bootstrap.min.js"></script> 
    </head> 
    <body> 
     <section> 
      <nav class="cl-effect-1" style="background-color:transparent"> 
       <a class="fifth before after" href="/">Home</a> 
      </nav> 
     </section> 
     <br /> 

     <div class="TelemetryReport"> 
      @for (int i = 0; i < Model.Reports.Count; i++) 
      { 
       @Html.Partial("Report", Model.Reports[i]) 
      } 
     </div> 


    </body> 
    </html> 

Report.htmlと

@using Microsoft.PowerBI.AspNet.Mvc; 

@{ 
    Layout = ""; 
} 
@model TelemetryReports.ReportViewModel 
<body> 

    <section class="color-9"> 
     <nav class="cl-effect-13"> 
      <div class="active">@Model.Report.Name</div> 
     </nav> 
    </section> 
    @Html.PowerBIAccessToken(Model.AccessToken) 
     @Html.PowerBIReport(Model.Report.Name, Model.Report.EmbedUrl, new { style = "height:35vh" }) 

    @*<div> 
     @Html.PowerBIAccessToken(Model.AccessToken) 
     @Html.PowerBIReport(Model.Report.Name,Model.Report.EmbedUrl, new { style = "height:85vh ; width:65vh;" }) 
    </div>*@ 

</body> 

最終ウェブページには、次のようになります

All the reports are same after the Power Bi engine loads

答えて

1

あなたがこの問題に直面していますグローバル@Html.PowerBIAccessToken(Model.AccessToken)を使用しているためですHTMLヘルパー。

これは1つのレポートでうまくいきますが、すべての場合、グローバルJavaScript変数が書き出され、そのたびにオーバーライドされ、リストされた最後のレポートが勝っています。複数のレポートを処理する場合は、アクセストークンを属性として埋め込みたい各レポートに渡す必要があります。

あなたは別のカップルの事を行う必要があります:

  1. は、各レポート
  2. ための埋め込みトークンを作成したカスタム属性
として埋め込む各レポートに生成されたトークンを渡します

@Html.PowerBIReport(Model.Report.Name,Model.Report.EmbedUrl, new { @powerbi_access_token = Model.AccessToken })

ASP.NET MVC HTMLヘルパーは、JavaScript SDKを共同で使用します同僚。 JavaScript SDKの詳細については、Power BI JavaScript SDK on GitHubをご覧ください。

+0

レポートIDとワークスペースコレクションIDとワークスペースIDを渡して、レンダリングするレポートごとに 'PowerBIToken.CreateReportEmbedToken(...)'を呼び出す必要があります。 –

+0

Works Fine :)ありがとうございました! –

関連する問題