C# SelectList不接受我的SelectListItem对象

C# SelectList不接受我的SelectListItem对象,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我试图用ASP.NET用户数据库的所有用户填充我的Html.Listbox 我创建了一个ViewModel,如下所示: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Globalization; using System.Web.Mvc; using System.Web.Security; namespace SkyLearn.

我试图用ASP.NET用户数据库的所有用户填充我的Html.Listbox

我创建了一个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>();
        }  
    }
}
        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)%>
使用系统;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
利用制度全球化;
使用System.Web.Mvc;
使用System.Web.Security;
命名空间SkyLearn.Areas.Users.Models
{
公共类UsersViewModel
{
MembershipUserCollection membershipuserscollection{get;set;}
公共列表成员身份UsersList{get;set;}
公共列表可用用户{get;set;}
public UsersViewModel()
{
availableUsers=新列表();
}  
}
}
以及一个如下所示的Actionresult:

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>();
        }  
    }
}
        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)%>
public ActionResult Index()
{
var users=Membership.GetAllUsers().Cast();
UsersViewModel model=新的UsersViewModel();
foreach(用户中的成员身份用户)
{
SelectListItem selectuser=新建SelectListItem();
选择user.Text=user.UserName;
选择user.Value=user.UserName;
model.AvailableUsers.Add(选择用户);
}
返回视图(模型);
}
在我看来,我尝试这样填充列表:

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>();
        }  
    }
}
        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:foreach语句无法对类型为“SkyLearn.Areas.Users.Models.UsersViewModel”的变量进行操作,因为“SkyLearn.Areas.Users.Models.UsersViewModel”不包含“GetEnumerator”的公共定义。

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; }
}
公共类UsersViewModel
{
公共用户视图模型{
AvailableUsers=新列表();
}
MembershipUserCollection membershipuserscollection{get;set;}
公共列表成员身份UsersList{get;set;}
公共列表可用用户{get;private set;}
}

问题在于,在视图模型(
AvailableUsers
)上使用与ListBox帮助程序的第一个参数相同的名称作为属性。那是不对的。第一个参数应该表示视图模型上的一个属性,该属性将用于将选定的值绑定回来。对于ListBox帮助程序,这应该是一个集合,因为用户可以选择多个值。对于DropDownList帮助器,这应该是一个简单的标量属性。第二个参数(在这两种情况下)表示将用于呈现可用选项的
SelectListItem
集合

因此,让我们举一个如何改进视图模型的示例:

public class UsersViewModel
{
    public string[] SelectedUsers { get; set; }
    public IEnumerable<SelectListItem> AvailableUsers { get; set; }
}
公共类UsersViewModel
{
公共字符串[]SelectedUsers{get;set;}
公共IEnumerable可用用户{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); 
}
public ActionResult Index()
{
var users=Membership.GetAllUsers().Cast();
var模型=新用户视图模型
{
AvailableUsers=用户。选择(x=>new SelectListItem
{
Value=x.UserName,
Text=x.UserName
})
};
返回视图(模型);
}
最后一个观点是:

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

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

x、 所选用户,型号。可用用户)%>

您会注意到,我已经去掉了最初在视图模型中使用的
membershipuserscollection
membershipuserslist
属性,这些属性在本例中没有任何用途。第一个是私有的,第二个是域模型(
MembershipUser
)的集合,因此它在视图模型中绝对没有位置。

我忘记创建构造函数是正确的。不幸的是,这对我来说是一个新问题,我开始在这件事上扯掉我的头发。CS1061:'System.Collections.Generic.IEnumerable'不包含'availableUsers'的定义,并且找不到接受'System.Collections.Generic.IEnumerable'类型的第一个参数的扩展方法'availableUsers'(是否缺少using指令或程序集引用?)。不确定这对您是否有意义?嗯,这在哪里发生?IEnmerable从何而来,这是您视图的模型吗?不知何故,它现在似乎将我的ViewModel对象视为可枚举对象。我无法从视图访问其中的任何列表:SIEnumerable是viewmodel。它应该包含我使用我的控制器用用户对象填充的用户列表。请更新您的问题并输入您的整个视图代码。编辑:UsersViewModel不是IEnumerable。它必须是一个包含列表的单一实例,不是吗?我在编码mvc3方面没有太多经验,我必须说我真的不能对你的代码示例掉以轻心。你有没有可能在代码中写一些注释来告诉我一步一步到底发生了什么?显然,我想用正确的方法来做。但对我来说,重要的是要了解我在做什么,而不仅仅是抄袭意大利面:)