无法在下拉菜单中选择元素

时间:2017-02-23 16:47:12

标签: c# .net asp.net-mvc

http://i.imgur.com/uDWL0YE.png

我正在关注Pluralsight上的Full Stack .NET课程,到目前为止一直运行良好。当我以用户身份登录并尝试向数据库添加演出时,我无法在下拉列表中选择一种类型,因此无法添加演出。我可以很好地查看这些类型,我只是不能选择一种。

以下是“创建视图”下拉列表的代码:

<div class="form-group">
    @Html.LabelFor(m => m.Genre)
    @Html.DropDownListFor(m => m.Genre, new SelectList(Model.Genres, "Id", "Name"), "", new { @class = "form-control" })
    @Html.ValidationMessageFor(m => m.Genre)
</div>

这是我在viewmodels文件夹中的Gig类:

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()
    {
        return DateTime.Parse(string.Format("{0} {1}", Date, Time));
    }
}

这是控制器中HttpPost操作的代码:

    [Authorize]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(GigFormViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            viewModel.Genres = _context.Genres.ToList();
            return View("Create", viewModel);
        }
        var gig = new Gig()
        {
            ArtistId = User.Identity.GetUserId(),
            DateTime = viewModel.GetDateTime(),
            GenreId = viewModel.Genre,
            Venue = viewModel.Venue
        };
        _context.Gigs.Add(gig);
        _context.SaveChanges();
        return RedirectToAction("Index", "Home");
    }

我无法弄清楚为什么我无法选择一种类型并将其保存到数据库中。单击“保存”时,它不会给我一个验证错误,而是重新加载页面。如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

您不应该在ViewModel上将Genres标记为Required,因为这只是显示视图时所需的支持列表。但是,当提交视图中的表单时,此属性将没有值,因此验证失败。

答案 1 :(得分:1)

问题是您在Genres

中标记为必需
  [Required]
  public IEnumerable<Genre> Genres { get; set; }

在下拉列表中

@Html.DropDownListFor(m => m.Genre, new SelectList(Model.Genres, "Id", "Name"), "", new { @class = "form-control" })

m.Genre将返回应设置为required的所选值,但new SelectList(Model.Genres, "Id", "Name")仅执行一次填充数据,而不会将数据返回到模态