在服务器端调用中使用javascript变量MVC

问题描述:

我目前使用嵌入式Power BI将报告嵌入到Web应用程序中,并且我想创建使用下拉框在组中的报告之间切换的功能。我设法使用适当的数据填充下拉框,但现在正努力在报告之间切换。我可以成功地做到这一点,如果我硬编码到服务器端的电话号码,但显然这是不可扩展的,而不是解决方案。下面是我的cshtml我需要一个方法来在reportSelector.onchange中的“@Model”调用能够看到选定的变量。在服务器端调用中使用javascript变量MVC

@model TaskWebApp.Models.EmbedConfig[] 

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

@if (!string.IsNullOrEmpty(Model[0].ErrorMessage)) 
{ 
    <div id="errorWrapper"> 
     <h2> 
      Error 
     </h2> 
     @Model[0].ErrorMessage 
    </div> 

    return; 
} 

<div> 
    <p>Select report</p> 
    <select id="reportSelector"></select> 
</div> 
<div id="reportContainer"></div> 

<script> 
    // Read embed application token from Model 
    var accessToken = "@Model[0].EmbedToken.Token"; 

    // Read embed URL from Model 
    var embedUrl = "@Html.Raw(Model[0].EmbedUrl)"; 

    // Read report Id from Model 
    var embedReportId = "@Model[0].Id"; 

    // Get models. models contains enums that can be used. 
    var models = window['powerbi-client'].models; 

    // Embed configuration used to describe the what and how to embed. 
    // This object is used when calling powerbi.embed. 
    // This also includes settings and options such as filters. 
    // You can find more information at https://github.com/Microsoft/PowerBI-JavaScript/wiki/Embed-Configuration-Details. 
    var config = { 
     type: 'report', 
     tokenType: models.TokenType.Embed, 
     accessToken: accessToken, 
     embedUrl: embedUrl, 
     id: embedReportId, 
     permissions: models.Permissions.All, 
     settings: { 
      filterPaneEnabled: true, 
      navContentPaneEnabled: true 
     } 
    }; 
    // Get a reference to the embedded report HTML element 
    var reportContainer = $('#reportContainer')[0]; 

    // Embed the report and display it within the div container. 
    var report = powerbi.embed(reportContainer, config); 

    var reportSelector = $('#reportSelector')[0]; 
    var optionString = "@Html.Action("PopulateDropdown", "Embed", Model[0].Reports)"; 
    reportSelector.onchange = function() { 
     var selected = this.selectedIndex; 
     var accessToken = "@Model[selected].EmbedToken.Token"; 

     // Read embed URL from Model 
     embedUrl = "@Html.Raw(Model[selected].EmbedUrl)"; 

     // Read report Id from Model 
     embedReportId = "@Model[selected].Id"; 

     // Get models. models contains enums that can be used. 
     models = window['powerbi-client'].models; 

     // Embed configuration used to describe the what and how to embed. 
     // This object is used when calling powerbi.embed. 
     // This also includes settings and options such as filters. 
     // You can find more information at https://github.com/Microsoft/PowerBI-JavaScript/wiki/Embed-Configuration-Details. 
     config = { 
      type: 'report', 
      tokenType: models.TokenType.Embed, 
      accessToken: accessToken, 
      embedUrl: embedUrl, 
      id: embedReportId, 
      permissions: models.Permissions.All, 
      settings: { 
       filterPaneEnabled: true, 
       navContentPaneEnabled: true 
      } 
     }; 
     var report = powerbi.embed(reportContainer, config); 
    } 
    reportSelector.innerHTML = optionString; 
</script> 

让我知道,如果有必要看到模型或控制器。任何帮助表示赞赏,因为我对MVC有点新,并且无法以我想要的方式使用变量。

编辑:函数创建下拉列表:

public string PopulateDropdown(ODataResponseListReport reports) 
     { 
      foreach (Claim claim in ClaimsPrincipal.Current.Claims) 
      { 
       if (claim.Type == "extension_GroupID") 
       { 
        GroupId = claim.Value; 
       } 
      } 
      string retVal = ""; 
      for (int i = 0; i < reports.Value.Count; i++) 
      { 
       retVal += "<option>" + reports.Value.ElementAtOrDefault(i).Name + "</option>"; 
      } 
      return retVal; 
     } 
+0

什么下拉列表访问它? '@ Model'是剃须刀代码 - 它在发送到视图之前在服务器上解析。代码如'var accessToken =“@Model [selected] .EmbedToken.Token”;'不起作用,因为'selected'是一个javascript变量,在那个时候不存在。 –

+0

ive添加了创建控制器中的下拉菜单的功能 –

+0

是的,我发现它的剃刀,但是在正确的方向上推动我如何将这个变量推入控制器方法或沿着这些方向的东西很棒 –

@Model是剃刀代码和它发送到视图之前被解析到服务器上。使用var accessToken = "@Model[selected].EmbedToken.Token";等引发错误,因为selected是一个JavaScript变量,在那个时候不存在 - 它不在范围内。

您可以将模型分配到使用

var model = var model = @Html.Raw(Json.Encode(Model)) 

JavaScript数组,然后用你的索引

var accessToken = model[selected].EmbedToken.Token;