2008-11-17 6 views
1

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

После отправки однако значение в исходном элементе 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> 

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

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

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

UPDATE
Для будущих читателей это может быть стоит прочитать это сообщение в блоге: http://haacked.com/archive/0001/01/01/model-binding-to-a-list.aspx

+0

Можете ли вы показать источник действия (по крайней мере, декларацию). – 2008-11-17 15:37:41

+0

public ActionResult AdvancedSearch (SearchBag searchBag) { // Делаем материал с параметрами в searchBag return View («AdvancedSearch», searchViewData); } – 2008-11-18 13:58:56

ответ

0

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

+0

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

+0

Я дважды проверил это, указав другую строку в Html.DropDownList(), но ошибка подтвердила, что другие строки не отображались в правильное поле модели. – 2008-11-17 14:33:37

0

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

0

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

public string FamilyCodes { get; set; } 

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

0

Был ли подобный вопрос вчера с избранными списками, список будет генерировать отлично, только на UpdateModel- fail = = not bound?

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

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) 

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

Страна = новый 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); 
} 

Я затем захватить значения в контроллерах Edit Action и присвоить обратно к объекту, обновление ...

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