SelectList 不会接受我的 SelectListItem 对象
本文关键字:我的 SelectListItem 对象 SelectList | 更新日期: 2023-09-27 18:31:08
我试图用我的 ASP.NET 用户数据库的所有用户填充我的Html.Listbox。
我创建了一个视图模型,如下所示:
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; }
}
问题是您使用与 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
)的集合,所以它在视图模型中绝对没有位置。