2016-06-20 4 views
1

다음 코드 (Render Partial) HTML 메서드를 사용하여 웹 페이지에서 여러 개의 Power Bi Reports를 렌더링하고 있습니다.Power Bi : 단일 HTML 페이지의 렌더링 보고서

디버깅 후 코드가 서로 다른 ID, 포함 URL 및 해당 보고서의 URL을 저장하는 결과와 잘 작동한다는 것을 알게되었습니다. 그러나 웹 페이지에로드 한 후 Power Bi 로딩 심볼을 얻은 후에 모든 타일에 마지막 리포트가 표시됩니다. 다른 보고서를 받고 있지만 타일은 다른 보고서를 표시하지 않습니다. 전원 바이 엔진 부하가 웹 페이지에, 나는 모든 타일에 마지막 보고서를 얻을 때 여기

는 (이 코드는 모든 다른 보고서를 저장하여 잘 작동) 코드입니다 :하지만,

컨트롤러 :

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; } 
    } 
,691 (넣다 디버깅을 위해 필요)

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 도우미.

단일 보고서에서는 정상적으로 작동하지만 커버 아래에는 전체 JavaScript 변수가 쓰여지므로 매번 재정의되어 최하위 보고서가 승리합니다. 여러 보고서를 처리 할 때 액세스 토큰을 특성으로 포함 할 각 보고서에 전달해야합니다.

당신은 다른 몇 일을해야합니다 : 사용자가 속성으로 각 보고서의 삽입으로 생성 된 토큰을 전달 각각

  • 를보고하기위한

    1. 가 삽입 토큰을 생성

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

      ASP.NET MVC HTML 도우미는 공동 작업자에서 JavaScript SDK를 사용합니다 vers. JavaScript SDK에 대한 자세한 내용은 @Power BI JavaScript SDK on GitHub을 참조하십시오.

  • +0

    작업 영역 컬렉션 및 작업 영역 ID와 함께 보고서 ID를 전달하여 렌더링하려는 각 보고서에 대해 'PowerBIToken.CreateReportEmbedToken (...)'을 호출해야합니다. –

    +0

    Works Fine :) 고마워요! –

    관련 문제