Выпадающий список множественного выбора урожая не всегда заполняется заданным значением - PullRequest
0 голосов
/ 20 мая 2019

У меня есть веб-форма ASP.net, заполненная данными из базы данных MS SQL и позволяющая редактировать значения.

Веб-приложение использует раскрывающийся список множественного выбора Harvest Chosen (макс. = 1), чтобы выбрать двух разных людей, выбранных из одного и того же списка информации, но на двух отдельных элементах управления.

Когда я обновляю страницу, иногда оба элемента управления заполняются с правильным значением, иногда ни один или один. Я проверил в консоли, и она определенно извлекает правильную информацию из БД, но я должен упустить что-то, касающееся того, как эти процедуры выполняются. Я делал эту работу с контроллерами VB.NET и ASP в прошлом. Я впервые использую функции AJAX и веб-методов. Я полагаю, что где-то пропущено обновление или я не понимаю порядок выполнения кода.

Я попытался явно указать порядок операций на странице .aspx, а затем не выполнял никаких триггеров обновления до тех пор, пока не будет выполнен весь код для контроллера, но, похоже, это сломало оба контроллера (оба выглядят как нормальный выбор контроллеров). Извиняюсь, если моя терминология не соответствует действительности, я очень самоучка. Текущее состояние кода, где я получаю несовместимое приложение

Страница .aspx как таковая. Каждый элемент управления имеет набор различных параметров, которые влияют на то, как он заполняется, и что происходит при его изменении.

<select class="chosen-select" multiple data-placeholder="Assign a scientist" name="ChosenScientist" style="width:800px;" id="cmbChosenScientist">
    <script type="text/javascript">
        handleChosenControls("select#cmbChosenScientist.chosen-select");
    </script>
</select>
<select class="chosen-select" multiple data-placeholder="Assign a supervisor" name="ChosenSupervisor" style="width:800px;" id="cmbChosenSupervisor">
    <script type="text/javascript">
        handleChosenControls("select#cmbChosenSupervisor.chosen-select");
    </script>
</select>

Страница aspx передает имя контроллера в функцию, которая сначала определяет все параметры, используемые контроллерами.

function defineChosenControls(controller) {
    switch (controller) {
        case "select#cmbChosenScientist.chosen-select":
            currentData = JSON.stringify({ sqlQueryName: "studyScientist" + "/" + MainContent_txbStudy.value });
            populateData = JSON.stringify({ sqlQueryName: "userList" });
            changeData = JSON.stringify({ strControlName: controller, arrValues: JSON.stringify($(controller).val()), strArg1: MainContent_txbStudy.value });
            break;
        case "select#cmbChosenSupervisor.chosen-select":
            currentData = JSON.stringify({ sqlQueryName: "studySupervisor" + "/" + MainContent_txbStudy.value });
            populateData = JSON.stringify({ sqlQueryName: "userList" });
            changeData = JSON.stringify({ strControlName: controller, arrValues: JSON.stringify($(controller).val()), strArg1: MainContent_txbStudy.value });
            break;
    }
}

Функция, которая обрабатывает заполнение параметров, установку текущего значения и обработку изменений, выглядит следующим образом:

function handleChosenControls(controller) {
    //Purpose: Any time a Chosen control is loaded, changed, etc., this is run.
    defineChosenControls(controller);
    $(controller).chosen({ max_selected_options: 1 });

    //Script for populating the control
    $.ajax({
        type: "POST",
        url: "ClientToServer.aspx/GetDT",
        data: populateData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            for (line of JSON.parse(response.d)) {
                $(controller).append('<option value="' + line[Object.keys(line)[0]] + '">' + line[Object.keys(line)[0]] + '</option>');
            }
            $(controller).trigger("chosen:updated");
        },
        error: function (response) { console.log("ERROR: Unable to pass changed values from controller " + controller + " to server-side."); }
    });

    //Script for determining current value during load
    $.ajax({
        type: "POST",
        url: "ClientToServer.aspx/GetDT",
        data: currentData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            for (line of JSON.parse(response.d)) {
                $(controller).val(line[Object.keys(line)[0]]).trigger("liszt:updated");
                console.log(line[Object.keys(line)[0]]);
            }
            $(controller).trigger("chosen:updated");
        },
        error: function (response) { console.log("ERROR: Unable to retrieve current value of " + controller + " from server-side."); }
    });

    //Script for when a value in the control is changed
    $(controller).on('change', function (e) {
        defineChosenControls(controller);
        $.ajax({
            type: "POST",
            url: "ClientToServer.aspx/PassJqueryControlValue",
            data: changeData,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
            },
            error: function (response) { console.log("ERROR: Unable to pass changed values from controller " + controller + " to server-side."); }
        });
    });
}

Я ожидаю, что оба элемента управления будут иметь правильное значение в БД, и эти значения правильно записываются в консоли браузера, но выбранные элементы управления не согласованы.

1 Ответ

0 голосов
/ 23 мая 2019

Решением было вызвать код после загрузки.

<script type="text/javascript">
$(window).bind("load", function() {
    handleChosenControls("select#cmbChosenScientist.chosen-select");
    handleChosenControls("select#cmbChosenSupervisor.chosen-select");
}); 

...