DropDownList SelectedValue не связывается должным образом - PullRequest
0 голосов
/ 22 мая 2009

У меня есть DropDownList, заполненный списком SelectList, сгенерированным из (анонимного типа), который имеет два свойства: CountryId (int) и «Description» (строка). Я хочу, чтобы выбранная страна в списке была страной по умолчанию.

Countries = new SelectList(countries, "CountryId", "Description", defaultCountry.CountryId);

где "страны" - это IQueryable анонимных типов из запроса Linq. Страна является публичной собственностью по модели представления:

public class CountryBaseViewModel
{
     public SelectList Countries { get; set; }
     public Contact Contact { get;set; }
     ....
}

HTML выглядит так:

<p>
<label for="CountryId">Home Country:</label>
<%= Html.DropDownList("CountryId", Model.Countries)%>
</p>

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

Но когда я отправляю изменение в метод Edit на контроллере, привязка кажется неудачной.

Например, когда я использую следующий HTML

<p>
<label for="Contact.Job">Job/Post:</label>
<%= Html.TextBox("Contact.Job", Model.Contact.Job) %>
</p>

И я называю метод

public ActionResult Create(Contact contact)

на контроллере, тогда значение contact.Job правильно вводится из TextBox, а CountryId - нет.

Я предполагаю, что MVC использует параметр "Contact.Job" (TextBox 1st), чтобы установить это. Но первым параметром DropDownList является «CountryId», а не «Contact.CountryId», потому что если это так, то выбранное значение не отображается в списке при его загрузке.

Похоже, что первый параметр TextBox предназначен для привязки данных, а первый параметр DropDownList - найти выбранный элемент.

Как использовать этот стиль привязки данных, чтобы получить выбранное значение, которое я хочу в DropDownList, а затем привязать его к Model.Contact.Country?

Ответы [ 3 ]

3 голосов
/ 22 мая 2009

Вы должны связать выбранное значение из выпадающего списка вручную, выполнив поиск того объекта, с которым вам действительно нужно связать в вашем действии контроллера, которое вызывается на POST. Вы можете использовать строго типизированное значение в ViewModel, как вы предлагали во втором посте, или вы можете найти значение раскрывающегося списка в пакете ViewData.

Итак, у вас есть почти все на месте, но в вашем действии контроллера, которое обрабатывает POST, вы захотите получить значение из выпадающего списка, загрузить объект, связанный с этим значением, а затем присоединить этот объект к объект, который вы пытаетесь обновить. В зависимости от вашей архитектуры, это часто просто простой вызов хранилища или службы доступа к данным. Вы должны выполнить это ручное связывание до сохранения изменений для основного объекта, с которым вы работаете.

1 голос
/ 22 мая 2009

Возможно, это не самое элегантное из доступных решений, но способ, которым я это сделал, состоял в том, чтобы вручную установить выбранное значение для объекта в ActionResult:

contact.CountryID = Request.Form("CountryId")

Я чувствую, что, возможно, есть лучшее решение, но я не знаю, что это такое.

0 голосов
/ 22 мая 2009

Нашел другой путь, хотя я не думаю, что он идеален!

Если я добавлю CountryId к модели представления и использую его для установки выбранного элемента, он заполняется при его изменении.

Тогда я делаю

contact.CountryId = Model.CountryId

Все еще не очень хорошо.

...