MVC3 Настройка элементов выпадающего списка в строго типизированном представлении

#entity-framework #asp.net-mvc-3

#entity-framework #asp.net-mvc-3

Вопрос:

У меня есть автоматически сгенерированный выпадающий список из Entity Framework в строго типизированном представлении:

  <div class="editor-field">
    @Html.DropDownList("User_FK", String.Empty)
    @Html.ValidationMessageFor(model => model.User_FK)
</div>
  

Автоматически сгенерированный выпадающий список

Вот код действия:

 public ActionResult Create()
{
    ViewBag.SystemMaster_FK = new SelectList(db.SystemMasters, "System_PK", "Name");
    ViewBag.User_FK = new SelectList(db.Users, "User_PK", "NetworkLogin");
    return View();
} 
  

Мне нужен этот список для отображения имен пользователей, загруженных из Active Directory. Как мне настроить параметры списка выбора отдельно?

Ответ №1:

@Html.DropDownList имеет другую перегрузку, а именно:

 public static MvcHtmlString DropDownList(
    this HtmlHelper htmlHelper,
    string name,
    IEnumerable<SelectListItem> selectList
)
  

Итак, вы указываете name строку, а затем IEnumerable<SelectListItem> генерируете любым удобным для вас способом.

Итак, (конечно, я предполагаю, что здесь есть некоторые типы — MyUserType , MyActiveDirectoryRepository )

 List<MyUserType> users = new List<MyUserType>();

foreach(var user in MyActiveDirectoryRepository.GetUsers())
{
    users.Add(new MyUserType()
    {
        ADName = user.Username,
        ID = user.ID // or SAM token, or something similar
    });
}
  

Передайте список в ваше представление через шаблон модели представления ViewBag.

 public ActionResult Create()
{
    // populate list as above
    ViewBag.User_FK = new SelectList(users, "ID", "ADName");
    return View();
}
  

Затем, после передачи его в ваше представление (предпочтительно, через view model, не ViewBag)

 @Html.DropDownList("NameOfDropDown", ViewBag.User_FK)
  

Комментарии:

1. CreateViewModel() не существует, или я не знаю, где его найти. Я чего-то не понимаю?

2. @Tjaart Извините — я забыл упомянуть это в моем списке предполагаемых типов. Это простой класс, содержащий List<MyUserType> свойство с именем MyList — это не более чем средство переноса модели, отправленной в ваше представление. Следовательно, «Модель представления»

3. На мой взгляд, он не видит myList. Возможно, потому, что моя модель уже определена, на мой взгляд, как @model SystemInformationManager.Models.SystemMaintainer

4. @Tjaart Я предположил, что в соответствии с вашим Create методом действия не было модели. return View(); не отправляет модель в представление. Вы можете попасть внутрь SystemMaintainer ? Если нет, возможно, вам придется включить это в CreateViewModel и изменить любой существующий код представления, который использует свойства SystemMaintainer.

5. ОК. У меня получилось. Мне пришлось изменить список выбора в действии контроллера на ViewBag.User_FK = new SelectList(users, "ID", "ADName"); , где users — это мой пользовательский тип пользователя. Причина, по которой объект не передается в представление, заключается в том, что Create загружает форму для вставки в таблицу SystemMaintainer. SystemMaintainer доступен, но как новый объект. Готовы ли вы отредактировать свой ответ, чтобы отразить то, что работает. Я изменю вопрос, чтобы было ясно, что это строго типизированное представление. Спасибо!