Использование переменной javascript в вызове MVC на стороне сервера

В настоящее время я использую Power BI, встроенный для встраивания отчетов в веб-приложение, и я хочу создать функцию для переключения между отчетами в группе с помощью раскрывающегося списка. Мне удалось заполнить раскрывающийся список соответствующими данными, но теперь я изо всех сил пытаюсь переключаться между отчетами. Я могу успешно это сделать, если я жестко закодирую номер в вызове на стороне сервера, но, очевидно, это не масштабируется и не является решением. Ниже мой cshtml. Мне нужен способ, чтобы вызовы «@Model» в reportSelector.onchange могли видеть выбранную переменную.

@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;
        }

person David Parsonson    schedule 09.08.2017    source источник
comment
Какой выпадающий список? И @Model - это код бритвы - он анализируется на сервере перед отправкой в ​​представление. Такой код, как var accessToken = "@Model[selected].EmbedToken.Token";, не работает, потому что selected — это переменная javascript, которой на данный момент не существует.   -  person    schedule 09.08.2017
comment
я добавил функцию, которая создает раскрывающийся список, который находится в контроллере   -  person David Parsonson    schedule 09.08.2017
comment
да, я столкнулся с тем фактом, что это бритва, но толчок в правильном направлении того, как я могу протолкнуть эту переменную в метод контроллера или что-то в этом роде, было бы здорово   -  person David Parsonson    schedule 09.08.2017
comment
Это самый странный способ, который я когда-либо видел, чтобы попытаться создать раскрывающийся список. Вы всегда можете сериализовать свою модель в переменную javascript, например. var model = @Html.Raw(Json.Encode(Model)), а затем получить к нему доступ с помощью вашего индексатора - var accessToken = "model[selected].EmbedToken.Token";   -  person    schedule 09.08.2017
comment
сериализация сработала на славу. Не знаю, хотели ли вы создать ответ, который я мог бы принять для этого решения. Я уверен, что это довольно хакерский вопрос, возникший из-за аналогичной проблемы не совсем понимания проблем с областью действия, представленных при работе с MVC.   -  person David Parsonson    schedule 09.08.2017


Ответы (1)


@Model — это код бритвы, который анализируется на сервере перед отправкой в ​​представление. Использование var accessToken = "@Model[selected].EmbedToken.Token"; и т. д. вызывает ошибку, потому что selected — это переменная javascript, которая на тот момент не существует — она не входит в область действия.

Вы можете назначить свою модель массиву javascript, используя

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

а затем получить к нему доступ с помощью вашего индексатора

var accessToken = model[selected].EmbedToken.Token;
person Community    schedule 09.08.2017