ASP.NET - теряется выбор выпадающего списка, заполненного через JavaScript - PullRequest
7 голосов
/ 06 января 2009

У меня есть два элемента управления раскрывающегося списка ASP.NET на странице. Первый перезванивает на сервер и получает массив, который возвращается клиенту и используется для заполнения второго выпадающего списка через javascript. Однако, если я сделаю выбор во втором (и недавно заполненном) выпадающем списке, а затем сделаю обратную передачу, выбор и содержимое второго выпадающего списка будут потеряны. Это проблема, так как мне нужно получить выбранное значение и сохранить содержимое списка после обратной передачи.

Как мне это исправить? Я предполагаю, что это вопрос обновления viewstate в какой-то момент перед обратной передачей?


Заполняемые мной элементы управления - это выпадающие списки ASP.NET. Вот javascript, который я использую для их заполнения.

Используемый код выглядит следующим образом (для краткости немного сокращен):

Управление ASP.NET Я заполняю:

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

public void RaiseCallbackEvent(string eventArgument)
    {
    return "1, 2, 3";
}

Код населения Javascript:

function ReceiveServerData(retValue)
{ 
    var statesArray = retValue.split(',');
    var statesList = document.getElementById('{0}');

    if (statesArray.length > 0 && statesList != null)
        {
                for (var j = 0; j < statesArray.length; j++)
            {
                    var newOption = document.createElement('OPTION');
                        statesList.options.add(newOption);
            newOption.value = statesArray[j].toString().trim();
                    newOption.innerText = statesArray[j];
                }
    }
}

Ответы [ 4 ]

6 голосов
/ 06 января 2009

Вы правы, утверждая, что у вас нет права ViewState, поэтому значения не заполняются при отправке данных обратно на сервер.

Я бы настоятельно рекомендовал бы перейти на использование Cascading Drop Down в ASP.NET AJAX Control Toolkit (он имеет версии .NET 2.0 и .NET 3.5) поскольку он делает то, что вам нужно, и он поддерживает через обратную передачу.

Другим вариантом будет событие onchange в раскрывающемся списке, заполненном JavaScript, в котором вы затем заполняете скрытое поле, так как оно будет отправлено обратно на сервер, и значение отправки будет сохранено. в опубликованных данных, что-то вроде:

$addHandler('change', $get('dynamicDDL'), function () { $get('hiddenField').value = this.options[this.selectedIndex].value; });

Для демонстрации я использовал сокращение MS AJAX для добавления событий и т. Д. Более подробную информацию о методах, которые я использовал, можно найти здесь: http://msdn.microsoft.com/en-au/library/bb397536.aspx

3 голосов
/ 03 августа 2009

Request.Form [Control.UniqueID] дает вам выбранное значение.

1 голос
/ 06 января 2009

просто используйте коллекцию response.forms, чтобы получить выбранное значение.

0 голосов
/ 06 января 2009

Я предполагаю, что "вы не делаете вещи способом asp.net".

Мне кажется, что если ваши модификации javascript не являются собственными asp.net, то элементы, которые вы заполняете, не являются элементами управления asp.net, поэтому вы теряете их при обратной передаче. asp.net действительно требует тесной связи между своей моделью и реальной страницей.

Может быть, далеко от базы - поможет, если вы можете опубликовать некоторый код. (JS и метод codebehind)

изменить для получения новой информации:

Правильно - поэтому вы в основном создаете загрузку совершенно обычных html-элементов только через JS на основе возвращаемой строки AJAXified (?), Которая в коде asp.net не имеет понятия о том, . Я не уверен на 100%, что это проблема без самостоятельной настройки тестового приложения, но звучит примерно так.

Проверка запроса. Формы - как и предполагали другие - будут самым простым способом исправить это прямо сейчас, но вы должны иметь в виду, что asp.net становится все более болезненным, чем дальше вы отказываетесь от выполнения действий, так, как он хочет, чтобы вы. Думаю, стоило бы поработать над тем, как добавить эти новые опции из кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...