MVC.NET Core / Razor:将 Select 框中的值提交给数据库

MVC.NET Core / Razor: Submit value from Select box to DB

表格定义在Add.cshtml:

@using bendinsnMusicApp.Models
@model Album

<h2>Add Album</h2>

<form action="Add" method="post">
    Title: <input type="text" name="Title" value="" autofocus />
    <span asp-validation-for="Title" class="text-danger"></span><br />
    Price: <input type="number" name="Price" value="" />
    <span asp-validation-for="Price" class="text-danger"></span><br />
    Artist: <select name="Artist">
        @foreach (Artist artist in ViewBag.Artists)
        {
            <option value=@artist.ArtistID>@artist.Name</option>
        }
    </select>
    <span asp-validation-for="Artist"></span><br />
    Genre: <select name="Genre">
    @foreach (Genre genre in ViewBag.Genres)
    {
        <option value=@genre.GenreID>@genre.Name</option>
    }
    </select>
    <span asp-validation-for="Genre"></span><br />

    <input type="submit" value="Submit" />
</form>

错误发生在我的控制器中的以下操作中,AlbumsController.cs:

[HttpPost]
public IActionResult Add(Album a)
{
    var albums = _context.Albums;
    albums.Add(a);
    _context.SaveChanges();
    var albums2 = _context.Genres.ToList();
    ViewBag.Artists = _context.Artists.ToList();
    ViewBag.Genres = _context.Genres.ToList();
    return View("Index", albums2);
}

具体来说,当尝试保存更改时,更新失败,因为专辑 object 的外键,ArtistID 和 GenreID 每次都为 0,而 Artist 和 Genre 均为 null。为了完整起见,这里是专辑 class:

public class Album
{
    public int AlbumID { get; set; }
    public string Title { get; set; }
    [Required]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }

    public int ArtistID { get; set; }
    public Artist Artist { get; set; }
    public int GenreID { get; set; }
    public Genre Genre { get; set; } 
}

似乎有些错误阻止了表单正确提交 Artist 和 Genre 字段,这两个字段都是 select 元素。此外,我希望即使提交了这些元素的实际内容,也不会包括 FK 值。

请注意,ViewBag.Artists 和 ViewBag.Genres 在渲染视图的操作中分别定义为 _context.Artists.ToList()_context.Genres.ToList()。每个流派和艺术家都包含一个 Name[class]ID,并且艺术家还有一个名为 Bio 的关联文本字段。

专辑 table 包括专辑 ID、艺术家 ID、流派 ID、价格和标题字段。前三个是int,第二个是decimal,最后一个是nvarchar。

需要做什么:

A) 将 select 元素的内容与表格的其余部分一起提交?

B) 使用 ArtistID 和 GenreID 值(int 在它们各自的 classes 中)作为填充专辑的参数 table?

每个select输入的名称需要对应模型中发生模型绑定时该值将填充的字段。

更改代码:

<select name="Artist">

<select name="ArtistID">

流派 select 也是如此,name="GenreID"

这将允许模型绑定正确地获取这些值,然后您可以根据需要在控制器中使用它们。