Ошибка CascadingDropDown — DropDownList имеет недопустимое значение selectedValue

У меня есть каскадные выпадающие списки, заполненные через jquery ajax. Перейдите по ссылке, чтобы получить образец кода Загрузить образец кода

Шаги, которые приводят к исключению:

1: Сделайте выбор для ModelYear, Make и Model

2: Нажмите кнопку «Очистить», чтобы сбросить раскрывающиеся списки, и тогда он выдает исключение.

Как я могу избавиться от этой ошибки? У меня есть странный способ обойти это, установив скрытое поле при щелчке «Очистить», а что нет, но у меня будет много других элементов управления на странице, которые будут выполнять обратную передачу, и обходной путь, который у меня есть, становится неуклюжим, и я ищу реальное решение.

Может быть, я делаю что-то не так, но любые указатели приветствуются.

Я внес некоторые изменения в доступ к ссылке. Пожалуйста, попробуйте и дайте мне знать, если это сработает.

Редактировать: Образец разработан с использованием VS2005/.NET 2.0 и WinXP, но сервером будет Win2003.


person gbs    schedule 02.03.2011    source источник
comment
Пример кода недоступен для загрузки. Проблема с разрешением?   -  person Oleg    schedule 02.03.2011
comment
Извини за это. Я просто щелкнул ссылку и смог скачать без входа в систему. Я впервые использую SkyDrive, поэтому не знаю, что может быть не так. Я уже установил его как общедоступный. Можете ли вы попробовать войти в Windows-Live, если у вас есть учетная запись?   -  person gbs    schedule 02.03.2011
comment
@gbs: мне нужно войти в Windows-Live, но после входа в систему я получаю сообщение на немецком языке, которое можно перевести как «Эта папка для вас не может быть освобождена (общий доступ)». Похоже, у них нет прав на доступ к Cascading. Вы можете попробовать использовать на нем другую учетную запись, или вам нужно попросить владельца папки разрешить доступ. Такая же проблема у меня с разных браузеров. Из вашей учетной записи у вас есть доступ, но вы должны разрешить другим людям доступ к файлу.   -  person Oleg    schedule 02.03.2011
comment
Пожалуйста, используйте @Oleg в комментарии, чтобы уведомить меня о комментарии. Подробнее см. здесь.   -  person Oleg    schedule 02.03.2011
comment
@Олег: Пожалуйста, попробуйте сейчас. У меня есть изменения прав доступа. Надеюсь, это сработает.   -  person gbs    schedule 03.03.2011
comment
@gbs: Я могу скачать сейчас, но я немного разочарован тем, что вы используете действительно ретро-технику, которой около 10 лет. Какую версию .NET вы используете? Почему вы не можете использовать веб-сервисы WCF или хотя бы ASMX вместо ASHX. Кроме того, вы выполняете ручную сериализацию JSON вместо использования как минимум JavaScriptSerializer существующего в .NET 3.5. Ручная сериализация будет работать неправильно, если тексты содержат или \, которые должны быть закодированы как \ и \\. Моя первая проблема заключается в том, что я не могу отладить его, потому что у меня нет версии 1.0.61025.0 из System.Web.Extensions. Поэтому мне нужно преобразовать его в .NET 4.0.   -  person Oleg    schedule 03.03.2011
comment
@gbs: в данный момент я писал другой ответ. Было бы лучше, если бы вы описали мне причину использования ретро-технологии и ответили, какая операционная система и .NET framework находятся на целевых серверах?   -  person Oleg    schedule 03.03.2011
comment
@gbs: Должен согласиться с Олегом. Вы пытаетесь заполнить раскрывающиеся списки на стороне клиента, но это серверные элементы управления. Я предполагаю, что есть проблема с состоянием просмотра. Элементы управления пытаются перепривязать, но за это время что-то изменилось. У меня нет решения для вас, потому что ваш код слишком сложен ... для такой простой проблемы. Вы должны сделать что-то вроде этого: weblogs.asp.net/jaredroberts/archive/2009/08/28/   -  person LeftyX    schedule 03.03.2011
comment
@Олег: .NET 2.0. Я использую собственный httphandler, который находится внутри библиотеки классов. Для создания образца я использовал .ashx. Насколько я понимаю, использование .asmx или WCF также приведет к ошибке, которую я вижу. Я должен был удалить нежелательные ссылки, такие как System.Web.Extensions и все такое. Извините за это и спасибо за изучение кода.   -  person gbs    schedule 03.03.2011
comment
@Oleg и @gbs: ashx с веб-формами asp.net в порядке. Я использовал его в прошлом, и он выполняет свою работу. Вся реализация слишком сложна.   -  person LeftyX    schedule 03.03.2011
comment
@LeftyX: Да, у меня уже открыта эта статья, и я добрался до нее из ее базовой статьи о mikesdotnetting. В любом случае, дело в том, что да, у меня более сложная система, чем в примере кода. Существуют и другие внешние переменные, которые зависят от года/марки/выбора модели. Я использую скрытые поля, как указано в статье, и повторно заполняю раскрывающиеся списки при обратной передаче для любых изменений на стороне клиента, т. е. ReloadDropDownSelection в коде программной части. Собственно, это и есть причина ошибки. Если я закомментирую это, я не увижу ошибку, когда нажму «Очистить», но тогда я потеряю значения, когда нажму «Отправить».   -  person gbs    schedule 03.03.2011
comment
@LeftyX: Дело в том, что бывают случаи, когда мне приходится заполнять раскрывающийся список из кода программной части, и есть другие элементы управления, которые принимают раскрывающийся список в качестве входных данных для заполнения себя отфильтрованными данными. Если бы это не было необходимо, то кода в моем .ashx было бы достаточно, и мне бы ничего не понадобилось в моем коде .ascx, и это было бы очень просто, как вы сказали. Спасибо за внимание.   -  person gbs    schedule 03.03.2011
comment
@gbs и @LeftyX: Я согласен, что у всего технологического есть своя область, которая лучше других. Иногда приходится использовать старый код, чтобы не переписывать все заново. Моя точка зрения такова: jQuery.ajax нужно получать данные с сервера. Лучшим способом предоставления данных являются веб-сервисы в форме WFC (в основном исполнительный и гибкий способ) и ASMX. Можно хорошо сочетать WFC и ASMX с любой другой технологией. См., например, мой другой ответ. Можно добавить еще одну страницу/URL, которая предоставит данные для jQuery.ajax.   -  person Oleg    schedule 03.03.2011
comment
@gbs: я закончил отвечать на другой вопрос и вернулся. Первое, что я нашел в вашем коде: вы не используете jQuery.ajax. Вы написали в первом предложении своего вопроса: у меня есть каскадные выпадающие списки, заполняемые через jquery ajax. Я что-то пропустил? Вы загрузили правильный код?   -  person Oleg    schedule 03.03.2011
comment
@Oleg: Да, загруженный код правильный. Я вызываю $.getJSON, который, как мне кажется, является сокращением для jQuery.ajax. Он находится внутри /scripts/cascading.js, а раскрывающийся список onchange подключен в CascadingUC.ascx.cs.   -  person gbs    schedule 03.03.2011
comment
@gbs: Извините, я очень быстро нашел код, но не опубликовал комментарий по этому поводу. Я пытался понять код, но это далеко не то, чем я обычно занимаюсь. До сих пор я не понимаю логику обновлений SelectedIndex для разных моделей в CascadingUC.ascx.cs после изменения его содержания на ajax. Более того, я не вижу четкого разделения модели данных между CascadingUC.ascx.cs и CascadeHandler.ashx. Возможно, вы найдете интересное чистое решение jQuery из моего старого ответа с демо.   -  person Oleg    schedule 03.03.2011
comment
@Oleg: В моем реальном коде данные поступают из базы данных и являются общими для обработчика, а также для .ascx.cs. Идея обновления SelectedYear/Make/Model заключается в повторном заполнении элементов раскрывающегося списка после обратной передачи, в противном случае раскрывающийся список будет несинхронизирован, если пользователь изменил выбор, поскольку это происходит исключительно через ajax. Чтобы понять это, просто попробуйте закомментировать эту строку ReloadDropDownSelection(); в .ascx.cs page_load. Затем запустите страницу, выберите модель и нажмите «Отправить». Вы увидите, что раскрывающийся список теряет выбор.   -  person gbs    schedule 03.03.2011


Ответы (2)


Я проверил ваш код и думаю, что быстрое и простое исправление будет состоять в том, чтобы проверить, исходит ли запрос от кнопки очистки. По сути, я бы не стал вызывать ReloadDropDownSelection(), если вы нажали кнопку очистки.

public partial class CascadingUC : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ModelYears.Attributes.Add("onchange", "OnModelYearChange()");
            Makes.Attributes.Add("onchange", "OnMakeChange()");
            Models.Attributes.Add("onchange", "OnModelChange()");
            LoadMakes();
            LoadModels();
        }
        else
        {
            if ((Request.Form["btnClear"]==null)||(Request.Form["btnClear"] != "Clear"))
                ReloadDropDownSelection();
        }
    }

Как я сказал вам в своих комментариях, я думаю, что проблема здесь в состоянии просмотра. Вы загружаете свой комбо-сервер (PopulateDropDownList), а затем меняете элементы на стороне клиента.

Я провел несколько лет, борясь с этими вещами (asp.net, viewstate, тысячи событий), и когда вышел ASP.NET MVC, я увидел свет ;-) Я действительно ненавидел веб-формы ASP.NET. Думаю, это была почти шутка.

person LeftyX    schedule 03.03.2011
comment
Спасибо за изучение кода, но, как я уже упоминал в своем вопросе, у меня есть странный способ обойти его, установив скрытое поле при нажатии кнопки «Очистить». Это похоже на ваше, но мой обходной путь является общим. Самая большая проблема заключается в том, что моя страница очень сложная, и есть несколько других элементов управления обратной передачей, действие которых влияет на раскрывающийся список UC. Прямо сейчас для каждого такого элемента управления я решаю, следует ли вызывать ReloadDropDownSelection. Он работает нормально. Кроме того, элемент управления .ascx будет использоваться и на других страницах, так что это будет головной болью. - person gbs; 03.03.2011
comment
Да, но дело в том, что вы хотите, чтобы ваша жизнь была сложной. В конце дня вы загружаете кучу дропбоксов каскадом, и вам нужно прочитать значение и, в конце концов, очистить их. Процесс очень простой и понятный. Ваш код очень сложный. Раньше я делал это и тратил 2 дня, чтобы понять вызовы событий и т. Д. И т. Д. Забавно, что в Интернете нет гражданства: вы читаете данные и публикуете данные. - person LeftyX; 03.03.2011

Я использовал обходной путь HiddenField, чтобы решить, следует ли перезагружать раскрывающийся список после обратной передачи или нет. При нажатии кнопки я устанавливаю значение скрытого поля.

Отредактировано: Еще один способ обойти ошибку, который я обнаружил, заключался в том, чтобы заключить мою привязку данных DropDown в блок try и иметь пустой улов.

try
{
    ddl.DataSource = list;
    ddl.DataTextField = "Text";
    ddl.DataValueField = "Value";
    ddl.DataBind();
}
catch{}

Я не видел никаких побочных эффектов этого в отношении моего кода.

Примечание. Не рекомендуется постоянно иметь пустой блок catch, который будет проглатывать ошибки.

person gbs    schedule 25.03.2011