2016-06-20 3 views
1

Я использую следующий код (Render Partial) HTML-кода для отображения нескольких отчетов Power Bi на моей веб-странице.Power Bi: рендеринг отчета на одной HTML-странице

После отладки я выяснил, что код работает нормально с результатом, хранящим разные идентификаторы, вставлять URL-адреса и URL-адреса соответствующих отчетов. Но после загрузки на веб-странице я получаю символ загрузки Power Bi, после которого все плитки отображают последний отчет в них. Плитки не показывают разные отчеты, хотя они получают разные отчеты.

Вот код (код работает отлично с хранением всех различных отчетов), но когда двигатель нагрузки мощность 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; } 
    } 

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. Создать маркер для вставки для каждого отчета
  2. Pass сгенерированного маркера в каждом врезать отчета как пользовательский атрибут

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

Помощники HTML ASP.NET MVC используют SDK JavaScript под руководством уегз. Вы можете узнать больше о JavaScript SDK @Power BI JavaScript SDK on GitHub.

+0

Вам нужно будет вызвать 'PowerBIToken.CreateReportEmbedToken (...)' для каждого отчета, который вы хотите визуализировать, передав в Id отчета вместе с коллекцией рабочей области и идентификатором рабочей области. –

+0

Работает отлично :) Большое спасибо! –