2009-12-14 1 views
2

Извините, если это повторяющийся вопрос, я просмотрел связанные вопросы и не видел ничего очевидного.Получение SelectedValue из DropDown в ASP.NET MVC (C#) с использованием Entity Framework

Я использую EditModel с объектом Entity вместе с двумя SelectLists в нем. Проблема в том, что, как только я достиг своего POST-действия, SelectedValues ​​для обоих выпадающих списков по-прежнему остаются теми же значениями по умолчанию, которые я задал в конструкторе для модели, независимо от того, что я на самом деле выбираю в браузере.

Мой конструктор устанавливает некоторые значения по умолчанию для SelectedValues, но они равны 0 и "" (которые не являются допустимыми значениями в выпадающих списках). У меня такое чувство, что проблема как-то вращается вокруг, но я расскажу подробнее.

Вот урезанная версия модели:

public class UserAccountModel 
{ 

    public UserAccount UserAccountData { get; set; } // Entity from EF 
    public SelectList Organizations { get; set; } 
    public SelectList Roles { get; set; } 

    public UserAccountModel() : this(null) 
    { 
    } 


    public UserAccountModel(UserAccount obj) 
    { 
     UserAccountData = (obj == null) ? new UserAccount() : obj; 

     // default selected value 
     int orgChildId = (UserAccountData.Organization == null) ? 0 : UserAccountData.Organization.ID; 
     string roleChildId = (UserAccountData.Role == null) ? "" : UserAccountData.Role.Name; 

     // go get the drop down options and set up the property binding 
     using (UserAccountRepository rep = new UserAccountRepository()) 
     { 
      Organizations = new SelectList(rep.GetOrganizationOptions(), "ID", "ID", orgChildId); 
      Roles = new SelectList(rep.GetRoleOptions(), "ID", "Name", roleChildId); 
     } 
    } 

    public void UpdateModel() 
    { 
     UserAccountData.Organization = Organizations.SelectedValue as Organization; 
     UserAccountData.Role = Roles.SelectedValue as Role; 
    } 
} 

Это часть Dropdowns представления:

   <div class="field"> 
       <label for="ID">Organization:</label> 
       <%= Html.DropDownList("ID", Model.Organizations) %> 
      </div> 

      <div class="field"> 
       <label for="Name">Role:</label> 
       <%= Html.DropDownList("Name", Model.Roles) %> 
      </div> 

я мог бы сделать что-то глупое и очевидное здесь. Примеры гораздо более прямолинейны при использовании словаря ViewData, но я не смог найти слишком много примеров, пытаясь использовать прямую привязку модели для SelectLists.

Любая помощь очень ценится!

Chris

+3

Какой код контроллера выглядит? – Lazarus

+1

Можете ли вы опубликовать некоторый код структуры UserAccountData, если вы привязываетесь к ViewModel, тогда я думаю, что имя selectlist должно быть «UserAccountData.ID» и «UserAccountData.Name», im not sure, потому что я не знаю структуру UserAccountData – JOBG

+0

UserAccountData - это объект, код которого генерируется Entity Framework. Тем не менее, еще одна часть информации, которую я должен был упомянуть, заключается в том, что Организация и роль являются внешними ключами в таблице UserAccount в БД. Когда я добавляю UserAccount, я хочу иметь возможность выбирать Организацию и Роль из существующих выборов в БД. Метод UpdateModel() в модели выше использовался для добавления выбранной организации и роли в UserAccountData – Chris

ответ

2

Выберите элементы отправлять только обратно фактическое значение выбранного него. В этом случае параметры будут возвращаться на сервере/контроллере в виде идентификатора (организации) и имени (роли). Модель, которую вы используете для действия обновления, должна либо содержать эти свойства, либо действие вашего контроллера должно принимать их непосредственно в качестве параметров. Списки на модели не будут заселены - и имена не совпадают ни в одном случае.

Измените модель, добавив:

public int ID { get; set; } 
public string Name { get; set; } 

с действием контроллера, как:

public ActionResult Update(UserAccountModel userAccount) 
{ 
    ... 
} 

Обратите внимание, что если есть ошибка проверки, вам необходимо заселить свойства SelectList (воссоздание меню).

+0

Итак, свойства SelectList на модели не обновляются? Я ожидал увидеть SelectedValue в SelectList, обновленный с фактическим выбранным значением из представления, а затем я вытащил бы это значение из SelectList и обновил свою UserAccountData. Если это не так, я отвечу на ваш совет и добавлю явные свойства для обновления. – Chris

+0

Нет. Поскольку в сообщении формы возвращаются только выбранные значения, у него даже нет данных для повторного заполнения списков выбора. Я всегда добавляю свойства как для перечисления (я использую IEnumerable ), так и выбранное значение в моих моделях. – tvanfosson

+0

Моя единственная проблема с этим в том, что я использую Entity Framework за репозиторием. Я фактически запрашиваю, чтобы все объекты были перечислены в SelectLists, потому что они очень маленькие. В результате я уже получил весь объект из БД. Вы просто просматриваете в своем списке выбора для идентификатора SelectedValue, чтобы получить полные данные? – Chris

1

Вы просто забыли навигационный путь к свойству ID :)

<%= Html.DropDownList("Organization.ID", Model.Organizations) %> 
+0

Я думал, что это тоже может быть так просто, но я подтвердил путь, и я думаю, что это правильно. «Организации» (множественное число) на самом деле является объектом SelectList объектов «Организация», поэтому идентификатор не существует в качестве члена организаций. Я думаю, мне нужно было бы указать организации. SelectedValue - тип Organization, но я не уверен, как это будет работать (если вообще) в представлении. Я открыт для предложений, хотя, поскольку мне просто не кажется правильным, что SelectedValue не будет правильно настроен каким-то образом! – Chris