Связывание модели с помощью SelectList

Я создаю DropDown с помощью метода Html.DropDownList (string NameSelectListInViewData). Это создает действительный ввод Select с правильными значениями. И все хорошо.

Однако после отправки значение в исходном списке SelectList не привязано.

Случай: ViewData.SearchBag.FamilyCodes:

public SelectList FamilyCodes { get; set; }

Html, который генерирует раскрывающийся список:

<%=Html.DropDownList("SearchBag.FamilyCodes")%>

Созданный html:

<select id = "SearchBag.FamilyCodes" name = "SearchBag.FamilyCodes">
    <option value = " ">Any</option>
    <option value = "A">BLUE</option>
    <option value = "B">BLACK</option>
    <option value = "C">BEIGE</option>
    <option value = "G">GREEN</option>
    <option value = "O">ORANGE</option>
    <option value = "P">PURPLE</option>
    <option value = "R">RED</option>
    <option value = "S">GRAY</option>
    <option value = "U">BROWN</option>
    <option value = "W">WHITE</option>
    <option value = "Y">YELLOW</option>
</select>

В моем контроллере у меня есть действие с параметром searchBag.

public ActionResult AdvancedSearch(SearchBag searchBag) { 
    //Do Stuff with parameters in searchBag
    return View("AdvancedSearch", searchViewData);
}

Все остальные поля связываются нормально, только поля выбора - нет. Есть идеи?

ОБНОВИТЬ
Будущим читателям, возможно, стоит прочитать это сообщение в блоге: http://haacked.com/archive/0001/01/01/model-binding-to-a-list.aspx

Можете показать источник действия (хотя бы декларацию).

Craig Stuntz 17.11.2008 18:37

public ActionResult AdvancedSearch (SearchBag searchBag) {// Делаем вещи с параметрами в searchBag return View ("AdvancedSearch", searchViewData); }

Boris Callens 18.11.2008 16:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 386
4

Ответы 4

Хотя SearchBag.FamilyCodes является допустимым идентификатором HTML, платформа будет пытаться сопоставить каждый элемент формы с соответствующим параметром с тем же именем, и вы не можете иметь точку в имени параметра. Если присвоить элементу управления отдельный идентификатор (другая перегрузка метода Html.DropDownList), пройдет ли он?

Я дал элементу управления другой (уникальный) идентификатор, но безрезультатно. Я назвал все свои другие элементы управления таким же образом, поскольку их модель находится в ViewData.Model.SearchBag. [AName] Поскольку представление правильно отображает все поля, я предполагаю, что имя этого поля правильное. Нет?

Boris Callens 17.11.2008 17:31

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

Boris Callens 17.11.2008 17:33

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

Boris Callens 20.11.2008 19:02

SearchBag должен быть в нижнем регистре в html (searchBag, а не SearchBag)

Я думаю, вам нужно изменить тип FamilyCodes с SelectList на строку.

public string FamilyCodes { get; set; }

Затем при отправке значение FamilyCodes должно быть значением, выбранным из раскрывающегося списка. У меня есть несколько таких в моем текущем проекте, и у меня нет проблем.

Это действительно работает, и я делаю это в некоторых местах. Но это не дает мне преимущества автоматического связывания модели из фреймворка. Кроме того, что происходит в списке выбора при множественном выборе?

Boris Callens 08.01.2009 23:34

Вчера была аналогичная проблема со списками выбора, список сгенерировался бы нормально, только что на UpdateModel- не работает = - не привязан?

И я нашел ответ в списке параметров ...

SelectList (
Collection - items to use in the  drop down,
ValueField - ie the primarykey as a String,
NameField  - ie the name of the thing as a String,
SelectedValue -  which is the passed in current objects FK relationship)

Так что для меня ...

Country = new SelectList (db.Countries, «pkCountry», «CountryName», address.fkCountry);

Я использую подход ViewModel - и это есть в конструкторе модели представления ...

public AddressCountryViewModel(){
public SelectList Countrys {get; private set;}
public AddressCountryViewModel(Address address)
{
     Countrys = new SelectList(db.Countries, "pkCountry", "CountryName",address.fkCountry);
}

Затем я беру значения в контроллерах Изменить действие и возвращаю их объекту, который обновляется ...

address.fkCountry = Convert.ToInt32(collection["fkCountry"]);

Поскольку SelectList действительно полезен только в сценарии для создания раскрывающегося списка, я чувствую, что он больше никуда не годится. Я перехожу к обычному списку и создаю SelectList в представлении. Однако, на мой взгляд, это имеет недостаток - больше C#. Так что это в основном вопрос предпочтений.

Boris Callens 03.08.2009 15:19

Привет, Борис - это сделано для предотвращения дополнительных скрытых полей, которые необходимы для привязки модели к базовой модели. Вы связались со статьей Hackked, и там много скрытых полей, которые нужны для ссылочной целостности модели ... по-моему, они вам не нужны.

littlegeek 03.08.2009 15:50

Другие вопросы по теме