0

我试图用我的 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>();
        }  
    }
}

一个如下所示的 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:foreach 语句无法对“SkyLearn.Areas.Users.Models.UsersViewModel”类型的变量进行操作,因为“SkyLearn.Areas.Users.Models.UsersViewModel”不包含“GetEnumerator”的公共定义

4

2 回答 2

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; }
}
于 2012-04-13T19:31:18.963 回答
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) %>

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

于 2012-04-13T20:07:09.050 回答