Asp.net 值不能为null。参数名称:项目(drownlist)

Asp.net 值不能为null。参数名称:项目(drownlist),asp.net,asp.net-mvc,view,controller,dropdownlistfor,Asp.net,Asp.net Mvc,View,Controller,Dropdownlistfor,我正在使用ASP.NET MVC4,现在我想添加一个包含mysql数据库数据的dropdownlist。我就是这么做的: 在我的视图中(Register.cshtml):` 我从我的存储库中获取地区,如下所示: public IQueryable<district> GetDistricts() { return from district in entities.districts orderby district.district_name

我正在使用ASP.NET MVC4,现在我想添加一个包含mysql数据库数据的dropdownlist。我就是这么做的:

在我的视图中(Register.cshtml):`

我从我的存储库中获取地区,如下所示:

 public IQueryable<district> GetDistricts()
 {
     return from district in entities.districts
            orderby district.district_name
            select district;
 }
publicIQueryable GetDistricts()
{
从实体中的地区返回。地区
orderby district.district\u name
选择地区;
}
我的注册表模型:

public class RegisterModel
{
    [Required]
    [Display(Name = "Given name")]
    public string Name { get; set; }

    [Required]
    [Display(Name = "Family name")]
    public string FamilyName { get; set; }

    [Required]
    [Display(Name = "Birthdate")]
    public DateTime BirthDate { get; set; }

    [Required]
    [Display(Name = "Sex")]
    public string Sex { get; set; }

    [Required]
    [Display(Name = "Nationality")]
    public string Nationality { get; set; }

    [Required]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    [Required]
    [Display(Name = "Street")]
    public string Street { get; set; }

    [Required]
    [Display(Name = "Street Number")]
    public int StreetNr { get; set; }

    [Required]
    [Display(Name = "District")]
    public IEnumerable<SelectListItem> Districts { get; set; }

    public int DistrictID { get; set; }
}
公共类注册表模型
{
[必需]
[显示(Name=“给定名称”)]
公共字符串名称{get;set;}
[必需]
[显示(Name=“Family Name”)]
公共字符串FamilyName{get;set;}
[必需]
[显示(Name=“生日”)]
公共日期时间出生日期{get;set;}
[必需]
[显示(Name=“Sex”)]
公共字符串Sex{get;set;}
[必需]
[显示(Name=“国籍”)]
公共字符串{get;set;}
[必需]
[显示(Name=“电子邮件”)]
公共字符串电子邮件{get;set;}
[必需]
[显示(Name=“User Name”)]
公共字符串用户名{get;set;}
[必需]
[StringLength(100,ErrorMessage={0}的长度必须至少为{2}个字符。”,MinimumLength=6)]
[数据类型(数据类型.密码)]
[显示(Name=“密码”)]
公共字符串密码{get;set;}
[数据类型(数据类型.密码)]
[显示(Name=“确认密码”)]
[比较(“密码”,ErrorMessage=“密码和确认密码不匹配。”)]
公共字符串ConfirmPassword{get;set;}
[必需]
[显示(Name=“Street”)]
公共字符串Street{get;set;}
[必需]
[显示(名称=“街道编号”)]
public int StreetNr{get;set;}
[必需]
[显示(Name=“District”)]
公共IEnumerable区域{get;set;}
public int DistrictID{get;set;}
}
dropdownlist中充满了地区,但当我单击“注册”时,会出现以下错误:

值不能为null。 参数名称:items

描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源

异常详细信息:System.ArgumentNullException:值不能为null。 参数名称:items

调试该方法时,我看到ModelState无效
键11是DistrictID并包含DistrictID,但键12是DistrictID并给出错误:
“district字段是必需的”


我做错了什么?

考虑一下模型验证失败的情况。视图将重新显示,模型随请求一起发送。然而,这一行:

new SelectList(ViewBag.Districts, "district_id", "district_name", Model.Districts)
null
作为第一个参数,因为未重新填充
ViewBag.Districts
,导致异常。因此,为了避免异常,只需再次设置此属性:

// If we got this far, something failed, redisplay form
var districts = repository.GetDistricts();
ViewBag.Districts = districts;
return View(model);

更新。看到模型定义时,立即想到的是
集合的
区域的
属性。很可能您不需要用户输入这些内容,也不需要将它们保存到数据库中。尝试删除此属性,有关此属性的错误将消失

只有验证失败或验证通过时才会引发异常?可能是现在的重复,当我单击“注册”时,它只是重新加载页面,值仍然填充,但什么也没有发生。。。也没有把它添加到database@niels123,你试过调试吗?至少您可以使用一些有意义的键,而不是
AddModelError
的空字符串,并将其显示在页面的某个位置,并显示Html.ValidationMessage-这将显示是否发生异常。但是,理解错误的最好方法就是调试这个方法。我检查了这个方法,但是modelstate是无效的。键11(DistrictID)具有my DistrictID的值,但键12(DistrictID)给出了一个错误:“需要区域字段”。@niels123,错误消息可以自我解释。在点击“注册”之前,你在地区下拉列表中选择了什么吗?@niels123,我想我终于找到了。您应该指定下拉列表用于
DistrictID
,换句话说,它定义了此属性的值。请尝试以下代码:
@Html.DropDownListFor(model=>model.DistrictID,…
new SelectList(ViewBag.Districts, "district_id", "district_name", Model.Districts)
// If we got this far, something failed, redisplay form
var districts = repository.GetDistricts();
ViewBag.Districts = districts;
return View(model);