C# 值不能为null。参数名称:DropDownListFor上的项目

C# 值不能为null。参数名称:DropDownListFor上的项目,c#,asp.net-mvc,C#,Asp.net Mvc,我正在尝试使用DropDownListFor返回一个模型的电子邮件列表。我在这个问题上找到了一些话题,所以这似乎很常见,我认为这个列表需要重新填充,但我找不到一种有效的方法(或者我理解的方法与其他示例相比) 无论我做什么,我总是得到空错误。我在想,也许它一开始并没有返回任何电子邮件,但我不理解dropdownlist与模型的工作方式 是否有其他问题导致当前无法看到的空值 我在类中定义列表: public class User { [Required] [Display(Name

我正在尝试使用DropDownListFor返回一个模型的电子邮件列表。我在这个问题上找到了一些话题,所以这似乎很常见,我认为这个列表需要重新填充,但我找不到一种有效的方法(或者我理解的方法与其他示例相比)

无论我做什么,我总是得到空错误。我在想,也许它一开始并没有返回任何电子邮件,但我不理解dropdownlist与模型的工作方式

是否有其他问题导致当前无法看到的空值

我在类中定义列表:

public class User {
    [Required]
    [Display(Name = "Email Address")]
    public string Email { get; set; }
    public IEnumerable<SelectListItem> EmailList { get; set; }
}
视图:


作为SelectListItem尝试此操作:

IList<SelectListItem> lst = new List<SelectListItem>();
        lst.Add(new SelectListItem()
            {
               Value = "Hello",
                Text = "World"
            });        
ViewBag.DropDownList = lst;
另一个选择是:

IList<SelectListItem> lst = new List<SelectListItem>();
        lst.Add(new SelectListItem()
            {
               Value = "Email",
               Text = "Email"
            });            
ViewBag.DropDownList = new SelectList(p.EmailList, "Value", "Text");

作为SelectListItem尝试此操作:

IList<SelectListItem> lst = new List<SelectListItem>();
        lst.Add(new SelectListItem()
            {
               Value = "Hello",
                Text = "World"
            });        
ViewBag.DropDownList = lst;
另一个选择是:

IList<SelectListItem> lst = new List<SelectListItem>();
        lst.Add(new SelectListItem()
            {
               Value = "Email",
               Text = "Email"
            });            
ViewBag.DropDownList = new SelectList(p.EmailList, "Value", "Text");

尝试在razor视图中的选择列表中传递“ViewBag.DropDownList”,而不是模型。EmailList@Nirman事实上,我把它放在了里面,并把它改成了
newselectlist
。。。试错真的。编辑主要帖子以在razor中添加ViewBag。因为
u.EmailList
null
(您没有初始化它,更不用说用任何项目填充它了)@Stephen Muecke我如何用项目填充它?一直在尝试将下面的答案(
lst
)包装在foreach中,并在user.EmailList中执行
SelectListItem项,但没有成功。我觉得我不明白什么。但是你所做的就是
var u=new User()
只初始化一个新的
用户
,该用户没有任何项目。您甚至不需要
ViewBag.DropDownList=…
该模型已经包含一个属性
IEnumerable EmailList
,因此在视图中它只是
@Html.DropDownListFor(model=>model.Email,model.EmailList),“---选择一个值----”,新建{…}
(除了您必须首先初始化
电子邮件列表
,使其不为
)尝试传递“ViewBag.DropDownList”在razor视图中的SelectList中,而不是模型。EmailList@Nirman实际上,我把它改成了
new SelectList
…真的是试错了。编辑了主要帖子,在razor中添加了ViewBag。因为
u.EmailList
null
(你没有初始化它,更不用说用任何项目填充它了)@Stephen Muecke我如何用项目填充它?我一直在尝试将下面的答案(
lst
)封装在foreach中,并在user.EmailList
中执行
SelectListItem项目,但没有用。我觉得我不明白一些事情。但您所做的只是
var u=new user()
只初始化一个新的
用户
,该用户不会有任何项目。而且您甚至不需要
ViewBag.DropDownList=…
该模型已经包含一个属性
IEnumerable EmailList
,因此在视图中它的just
@Html.DropDownListFor(model=>model.Email,model.EmailList,“---选择一个值----”,new{…})
(除非您必须首先初始化
电子邮件列表
,使其不为
)第一个解决方案只返回一个记录
World
,而它应该返回一个电子邮件列表。我是否错过了应该查找/查询它们的部分?我认为该模型能够自动解决它。当然,这只是我的示例,您需要用所需的记录填充它。我只是告诉您如何使用它应该可以工作并防止错误。第一个解决方案只返回一条记录,而它应该返回一个电子邮件列表。我是否错过了应该查找/查询它们的部分?我认为该模型能够自动解决它。当然,这只是我的示例,您需要用所需的记录填充它。I j我们必须向您介绍它应该如何工作,并防止出现错误。
var u = new User();
ViewBag.DropDownList = u.EmailList //You need to populate your EmailList first before you declare it here.
return View(u);
IList<SelectListItem> lst = new List<SelectListItem>();
        lst.Add(new SelectListItem()
            {
               Value = "Email",
               Text = "Email"
            });            
ViewBag.DropDownList = new SelectList(p.EmailList, "Value", "Text");
@Html.DropDownListFor(model => model.Email, (SelectList)ViewBag.DropDownList, "---Select a value---", new { htmlAttributes = new { @class = "form-control" } })