Я создаю 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
public ActionResult AdvancedSearch (SearchBag searchBag) {// Делаем вещи с параметрами в searchBag return View ("AdvancedSearch", searchViewData); }





Хотя SearchBag.FamilyCodes является допустимым идентификатором HTML, платформа будет пытаться сопоставить каждый элемент формы с соответствующим параметром с тем же именем, и вы не можете иметь точку в имени параметра. Если присвоить элементу управления отдельный идентификатор (другая перегрузка метода Html.DropDownList), пройдет ли он?
Я дал элементу управления другой (уникальный) идентификатор, но безрезультатно. Я назвал все свои другие элементы управления таким же образом, поскольку их модель находится в ViewData.Model.SearchBag. [AName] Поскольку представление правильно отображает все поля, я предполагаю, что имя этого поля правильное. Нет?
Я дважды проверил это, указав другую строку для Html.DropDownList (), но ошибка подтвердила, что другие строки не отображались в правильном поле модели.
Я также попытался поместить свои ценности непосредственно под модель, но безрезультатно. Я не думаю, что проблема в точке
SearchBag должен быть в нижнем регистре в html (searchBag, а не SearchBag)
Я думаю, вам нужно изменить тип FamilyCodes с SelectList на строку.
public string FamilyCodes { get; set; }
Затем при отправке значение FamilyCodes должно быть значением, выбранным из раскрывающегося списка. У меня есть несколько таких в моем текущем проекте, и у меня нет проблем.
Это действительно работает, и я делаю это в некоторых местах. Но это не дает мне преимущества автоматического связывания модели из фреймворка. Кроме того, что происходит в списке выбора при множественном выборе?
Вчера была аналогичная проблема со списками выбора, список сгенерировался бы нормально, только что на 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#. Так что это в основном вопрос предпочтений.
Привет, Борис - это сделано для предотвращения дополнительных скрытых полей, которые необходимы для привязки модели к базовой модели. Вы связались со статьей Hackked, и там много скрытых полей, которые нужны для ссылочной целостности модели ... по-моему, они вам не нужны.
Можете показать источник действия (хотя бы декларацию).