表单在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);
}
具体来说,当尝试保存更改时,更新失败,因为Album对象的外键ArtistID和GenreID每次都为0,而Artist和Genre都为空。为了完整起见,下面是Album类:
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。艺术家和ViewBag。在动作中分别定义为_context.Artists.ToList()
和_context.Genres.ToList()
来渲染视图。每个流派和艺术家包括一个Name
和[class]ID
,和艺术家有一个相关的文本字段称为Bio
以及。
Albums表包括AlbumID、ArtistID、GenreID、Price和Title字段。前三个是int型,第二个是decimal型,最后一个是nvarchar型。
需要做些什么:
A)将select
元素的内容与表单的其余部分一起提交?
B)使用ArtistID和GenreID值(int
s在各自的类中)作为填充Albums表的参数?
每个选择输入的名称需要对应于模型中值将在模型绑定发生时填充的字段。
修改代码:
<select name="Artist">
<select name="ArtistID">
和相同的类型选择,name="GenreID"
这将允许模型绑定正确地拾取这些值,然后您可以根据需要在控制器中使用它们。