现场是必需的。即使填写了字段 - 验证

时间:2017-11-19 17:49:29

标签: asp.net asp.net-mvc entity-framework

我正在学习本课程,教师添加了代码以向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行。

我在这里做错了吗?任何指导表示赞赏。

感谢。

1 个答案:

答案 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
}