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"
这将允许模型绑定正确地获取这些值,然后您可以根据需要在控制器中使用它们。
表格定义在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"
这将允许模型绑定正确地获取这些值,然后您可以根据需要在控制器中使用它们。