值不能为空.参数名称:items(DrodownList)

nie*_*lsv 5 asp.net asp.net-mvc controller view dropdownlistfor

我正在使用ASP.NET MVC4,现在我想添加一个包含来自mysql数据库的数据的下拉列表.这就是我做的:

在我看来(Register.cshtml):`

<div class="control-group">
    @Html.LabelFor(m => m.DistrictID, new { @class= "control-label"})
    <div class="controls">
        @Html.DropDownListFor(model => model.DistrictID, new SelectList(ViewBag.Districts, "district_id", "district_name", Model.DistrictID))
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

在我的Controller(AccountController)中:

[AllowAnonymous]
public ActionResult Register()
{
    var districts = repository.GetDistricts();
    ViewBag.Districts = districts;

    return View(new RegisterModel());
}

//
// POST: /Account/Register

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{

    if (ModelState.IsValid)
    {
        // Attempt to register the User
        try
        {
            MembershipService.CreateUser(model.Name, model.FamilyName, model.BirthDate, model.Sex, model.Nationality, model.Email, model.UserName, model.Password, model.Street, model.StreetNr);

            FormsAuthentication.SetAuthCookie(model.UserName, false);
            return RedirectToAction("Index", "Home");
        }
        catch (ArgumentException ae)
        {
            ModelState.AddModelError("", ae.Message);
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

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

 public IQueryable<district> GetDistricts()
 {
     return from district in entities.districts
            orderby district.district_name
            select district;
 }
Run Code Online (Sandbox Code Playgroud)

我的RegisterModel:

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; }
}
Run Code Online (Sandbox Code Playgroud)

下拉列表中有区域,但是当我点击"注册"时,我收到此错误:

值不能为空.参数名称:items

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

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

当我调试方法时,我看到ModelState无效.
键11是DistrictID,包括districtid但Key 12是Districts并给出错误:"The district field is required"...

我究竟做错了什么?

And*_*rei 6

考虑模型验证失败的情况.对于随请求发送的模型,将再次重新显示视图.不过这一行:

new SelectList(ViewBag.Districts, "district_id", "district_name", Model.Districts)
Run Code Online (Sandbox Code Playgroud)

null作为第一个参数,因为ViewBag.Districts没有重新填充,导致异常.因此,为了避免异常,只需再次设置此属性:

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

更新.在看模型定义时,立即进入脑海的东西是集合的Required属性Districts.很可能您不需要用户输入任何这些,也不需要将它们保存到数据库中.尝试删除此属性,有关此属性的错误将消失.