使用带有两个参数的视图模型在控制器中处理表单

handling form in controller using viewmodel with two parameters

我想将表单中的值保存到我的数据库中。我正在使用带有选择列表 属性 和常规模型的视图模型。下拉列表中的值不会保存。尽管这是一件微不足道且看似非常简单的事情,但我还是很迷茫。 在我的代码下方:

型号:

public class Movie
    {
        public int MovieID { get; set; }
        public string Name { get; set; }

        public int StudioID { get; set; }
        public Studio Studio { get; set; }
    }

我的视图模型:

public class CreateMoviesViewModel
    {
        public Movie Movie { get; set; }
        public IEnumerable<SelectListItem> StudiosSelectList { get; set; }
    }

我的控制器:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(CreateMoviesViewModel movieViewModel)
    {
        if (ModelState.IsValid)
        {                
            _context.Add(movieViewModel);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

        movieViewModel.StudiosSelectList = new SelectList(_context.Studios.AsNoTracking(), "StudioID", "Name");

        return View(movieViewModel);

最后,我的表格:

      <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="Movie.MovieID" />
            <div class="form-group">
                <label asp-for="Movie.Name" class="control-label"></label>
                <input asp-for="Movie.Name" class="form-control" />
                <span asp-validation-for="Movie.Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Movie.StudioID" class="control-label"></label>
                @Html.DropDownListFor(m => m.StudiosSelectList, Model.StudiosSelectList, "Select one")
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>

我的下拉列表或 POST 部分中描述的逻辑可能有问题。非常感谢任何帮助!

您需要将选定的下拉值传递给您的模型:

public class CreateMoviesViewModel
{
    public int SelectedValueId { get; set; } // <-- not sure what are you selecting, this could be MovieId if you are selecting a movie
    public Movie Movie { get; set; }
    public IEnumerable<SelectListItem> StudiosSelectList { get; set; }
}

那么你可以使用:

@Html.DropDownListFor(m => m.SelectedValueId, m.StudiosSelectList)

这样,所选值 Id 将传递给您的模型。

SelectValueId 应初始化为您要在下拉列表中显示的默认值。