2015-05-01 3 views
0

Я меняю элементы в DropDownList ASP.NET с помощью jquery, но когда я отправляю форму, свойство SelectedItem в DropDownList равно null. Любая идея, как я могу изменить список элементов в DropDownList с помощью jquery, не вызывая эту ошибку в коде?Ошибка при изменении ASP.NET DropDownList с javascript

Вот как я настраиваю DropDownList. Первоначально это пустой ASP.NET DropDownList.

var mailType = $("#ContentPlaceHolder1_ddlMailType"); 

mailType.empty(); 
mailType.append("<option></option>"); 
mailType.append("<option value='D'>Direct Mail</option>"); 
. 
. 
. 

В результате DropDownList показывает добавленные элементы после выполнения jquery.

ответ

3

К сожалению, вы не можете использовать jquery или Javascript для добавления элементов на серверный ASP.NET-сервер. Содержимое элемента управления списком хранится в ViewState, и если вы не сделали что-то очень странное, ваш jquery не обновляет ViewState. Если включена проверка, ASP.NET выдает ошибку, если тег/значение формы post не соответствует ни одному из известных значений, которые хранятся в ViewState.

Если вы хотите иметь список с элементами, которые динамически добавляются на стороне клиента, не используйте серверный контроль. Просто введите HTML в веб-форму ASP напрямую (не используйте тег runat = server). Чтобы прочитать содержимое элемента управления при обратной передаче, не обращайтесь к элементу управления; вместо этого используйте HttpContext.Request.Form ["tag name"]. Обратите внимание, что ваш код не знает, что ваш jquery добавил в список, так как эта информация не передается, когда браузер отправляет форму - передается только атрибут value для выбранного элемента.

Для получения дополнительной информации см. Один из моих других ответов here.

0

Я бы сказал, если раскрывающийся список был создан с помощью .Net back-end, Id может отличаться. Убедитесь, что идентификатор в интерфейсе - это тот же идентификатор в jquery.

+0

DropDownList имеет идентификатор типа ddlMailType и во время выполнения переименовывается в ContentPlaceHolder1_ddlMailType. Это как обычно делает ASP.NET. Я просто использую этот идентификатор для ссылки на элемент управления из javascript. В коде позади, я могу ссылаться на управление просто отлично. – birdus

+0

И, как я уже сказал, элементы отображаются правильно в поле со списком после запуска javascript. – birdus

+0

не могли бы вы попробовать получить объект таким образом? $ ('# <% = ddlMailType.ClientID%>') Я не уверен, что это поможет или нет. – btrbt

0

Пара вещей, которые вы должны проверить. 1) Измените свой JavaScript, чтобы динамически вывести идентификатор клиента. Идентификатор клиента изменяется с каждым событием обратной связи.

var mailType = $("<%= ddlMailType.ClientID %>"); 

mailType.empty(); 
mailType.append("<option></option>"); 
mailType.append("<option value='D'>Direct Mail</option>"); 

Кроме того, 2) Если вы связывание исходных значений выпадающего списка в коде позади убедитесь, что вы регулируете пост обратно событие. В противном случае выпадающее меню будет сброшено до его первоначального значения каждый раз, когда появится сообщение назад.

If Not Page.IsPostBack Then 
     ddlMailType.databind() 
End If 
+0

Я пробовал использовать ClientID (как и предлагал другой плакат) без каких-либо различий в поведении. Кроме того, в коде отсутствует привязка данных. – birdus

+0

Вы используете панель обновления AJAX? Если так отключите Ajax и посмотрите, что произойдет. – MAlvarez

0

Ваш контроль объявлен без элементов в aspx. так как ничего не добавляется в коллекцию элементов, и никакое добавление к элементам не выполняется в page_init или page_load (когда IsPostback = false), когда происходит обратная передача, чтобы проверить SelectedItem, свойство items вашего DropDownList пуст.

вы можете получить значение из коллекции форм Request.Form [MyDDL.UniqueID]

более подробно здесь. Why does DropDownList.SelectedValue is relied on viewstate?

Смежные вопросы