[英]System.ArgumentNullException: 'Value cannot be null. Parameter name: items'
[英]Value cannot be null. Parameter name: items (DrodownList)
我正在使用 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>
在我的控制器(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);
}
我从我的存储库中获取 Districts ,如下所示:
public IQueryable<district> GetDistricts()
{
return from district in entities.districts
orderby district.district_name
select district;
}
我的注册模型:
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; }
}
下拉列表中充满了地区,但是当我单击“注册”时,出现此错误:
值不能为空。 参数名称:items
说明:在执行当前 Web 请求期间发生未处理的异常。 请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。
异常详细信息:System.ArgumentNullException:值不能为空。 参数名称:items
当我调试该方法时,我发现 ModelState 无效。
键 11 是 DistrictID 并包括 DistrictID 但键 12 是 Districts 并给出错误: "The district field is required"
...
我究竟做错了什么?
考虑模型验证失败的情况。 视图将与请求一起发送的模型再次重新显示。 然而这一行:
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);
更新。 当看到模型定义时,立即想到的是Districts
集合的Required
属性。 很可能您不需要用户输入任何这些内容,也不需要将它们保存到数据库中。 尝试删除此属性,有关此属性的错误将消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.