我正在学习本课程,教师添加了代码以向DB添加记录。将要添加到数据库的类如下所示:
public class Gig
{
public int Id { get; set; }
public ApplicationUser Artist { get; set; }
[Required]
public string ArtistId { get; set; }
public DateTime DateTime { get; set; }
[Required]
[StringLength(255)]
public string Venue { get; set; }
public Genre Genre { get; set; }
[Required]
public byte GenreId { get; set; }
}
并且有一个视图模型附加到视图,进行映射,它看起来像这样:
public class GigFormViewModel
{
[Required]
public string Venue { get; set; }
[Required]
[FutureDate]
public string Date { get; set; }
[Required]
[ValidTime]
public string Time { get; set; }
[Required]
public byte Genre { get; set; }
[Required]
public IEnumerable<Genre> Genres { get; set; }
public DateTime GetDateTime() => DateTime.Parse($"{Date} {Time}");
}
我有一个create方法,它获取表单字段,并执行从视图模型到模型本身的映射,然后尝试将记录添加到数据库,我的创建操作如下所示:
[Authorize]
[HttpPost]
public ActionResult Create(GigFormViewModel viewModel)
{
viewModel.Genres = _context.Genres.ToList();
if (!ModelState.IsValid)
{
return View(viewModel);
}
var gig = new Gig()
{
GenreId = viewModel.Genre,
ArtistId = User.Identity.GetUserId(),
DateTime = viewModel.GetDateTime(),
Venue = viewModel.Venue
};
_context.Gigs.Add(gig);
_context.SaveChanges();
return RedirectToAction("Index", "Home");
}
在提交时,我获取viewModel的属性Genres
并用数据库中的记录填充它,然后检查ModelState.IsValid
。但是它给了我:
类型字段是必需的
虽然我只设置了2行。
我在这里做错了吗?任何指导表示赞赏。
感谢。
答案 0 :(得分:1)
您不需要在视图模型中向Genres
属性添加验证数据注释,因为它不是由用户设置的数据,而是由您设置以帮助您的视图获取集合Genre
并填充下拉列表等内容。
首先,删除在[Required]
中装饰Genres
属性的GigFormViewModel
属性。
其次,重构你的行动方法,特别是下面的if
集团:
[Authorize]
[HttpPost]
public ActionResult Create(GigFormViewModel viewModel)
{
if (!ModelState.IsValid)
{
// re-populate Genres collection only is tha data is in invalid state.
viewModel.Genres = _context.Genres.ToList();
return View(viewModel);
}
// The remainder code does not change
}