2012-04-13 2 views
0

Im пытается заполнить свой Html.Listbox всеми пользователями моей пользовательской базы данных ASP.NET.SelectList не принимает мой объект SelectListItem

Я создал ViewModel, который выглядит следующим образом:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Globalization; 
using System.Web.Mvc; 
using System.Web.Security; 

namespace SkyLearn.Areas.Users.Models 
{ 
public class UsersViewModel 
    { 
     MembershipUserCollection membershipuserscollection { get; set; } 
     public List<MembershipUser> membershipuserslist { get; set; } 
     public List<SelectListItem> AvailableUsers { get; set; } 

     public UsersViewModel() 
     { 
      availableUsers = new List<SelectListItem>(); 
     } 
    } 
} 

И в ActionResult, который выглядит следующим образом:

 public ActionResult Index() 
    { 
     var users = Membership.GetAllUsers().Cast<MembershipUser>(); 

     UsersViewModel model = new UsersViewModel(); 

     foreach (MembershipUser user in users) 
     { 
      SelectListItem selectuser = new SelectListItem(); 

      selectuser.Text = user.UserName; 
      selectuser.Value = user.UserName; 

      model.AvailableUsers.Add(selectuser); 
     } 

     return View(model); 
    } 

На мой взгляд, я стараюсь, чтобы заполнить список, как это:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SkyLearn.Areas.Users.Models.UsersViewModel>" %> 


<%= Html.ListBox("AvailableUsers", Model.AvailableUsers)%> 

Когда я запускаю код, я получаю следующую ошибку:

CS1579: Еогеасп оператор не может работать с переменными типа «SkyLearn.Areas.Users.Models.UsersViewModel», потому что «SkyLearn.Areas.Users.Models.UsersViewModel» не содержит публичное определение «GetEnumerator»

ответ

1

AvailableUsers не инициализированы, вы можете сделать это в конструкторе вашего ViewModel, например.

public class UsersViewModel 
    { 
    public UsersViewModel { 
     AvailableUsers = new List<SelectListItem>(); 
    } 
    MembershipUserCollection membershipuserscollection { get; set; } 
    public List<MembershipUser> membershipuserslist { get; set; } 
    public List<SelectListItem> AvailableUsers { get; private set; } 
} 
+0

Правильно, что я забыл сделать конструктор. к сожалению, это просто доказало новую проблему для меня, xD im, которая начинает вырывать мои волосы на этом. CS1061: 'System.Collections.Generic.IEnumerable ' не содержит определения для 'availableUsers' и никакого метода расширения 'availableUsers', принимающего первый аргумент типа 'System.Collections .Generic.IEnumerable 'можно найти (вам не хватает директивы использования или ссылки на сборку?) не уверен, что это имеет для вас какое-либо значение? – AronChan

+0

Хммм, где это происходит? Откуда у этого IEnmerable появилась модель вашего представления? –

+0

Как-то кажется, что теперь мой объект ViewModel рассматривается как Перечислимый. я не могу получить доступ к любому из списков на нем из моего представления: S – AronChan

0

Проблема заключается в том, что вы используете такое же имя, как первый аргумент помощника ListBox в качестве свойства на вашей модели представления (AvailableUsers). Это неправильно. Первый аргумент должен представлять свойство в вашей модели представления, которое будет использоваться для привязки выбранных значений назад. В случае с помощником ListBox это должна быть коллекция, потому что пользователь может выбрать несколько значений. В случае помощника DropDownList это должно быть простое скалярное свойство. Второй аргумент (в обоих случаях) представляет собой набор из SelectListItem, который будет использоваться для визуализации доступных параметров.

Итак, давайте рассмотрим пример того, как вы могли бы улучшить вашу модель представления:

public class UsersViewModel 
{ 
    public string[] SelectedUsers { get; set; } 
    public IEnumerable<SelectListItem> AvailableUsers { get; set; } 
} 

, а затем контроллер:

public ActionResult Index() 
{ 
    var users = Membership.GetAllUsers().Cast<MembershipUser>(); 
    var model = new UsersViewModel 
    { 
     AvailableUsers = users.Select(x => new SelectListItem 
     { 
      Value = x.UserName, 
      Text = x.UserName 
     }) 
    }; 
    return View(model); 
} 

и, наконец, вид:

<%@ Page 
    Title="" 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<UsersViewModel>" 
%> 

<%= Html.ListBoxFor(x => x.SelectedUsers, Model.AvailableUsers) %> 

You заметят, что я избавился от membershipuserscollection и membershipuserslist собственности которые вы первоначально использовали в своей модели просмотра, которые в этом примере не имеют никакой цели. Первый из них является частным, а второй представляет собой набор доменной модели (MembershipUser), поэтому он не имеет абсолютно никакого места в модели представления.

+0

У меня нет большого опыта в кодировании mvc3, и я должен сказать, что на самом деле я не могу обернуть мою голову на ваш пример кода. любой шанс, что вы могли бы написать некоторые комментарии в коде, чтобы сказать мне, что происходит поэтапно? очевидно, я хочу сделать это правильно. но для меня важно понять, что я делаю, а не просто копировать макароны :) – AronChan

Смежные вопросы