表单在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>
Price: <input type="number" name="Price" value="" />
<span asp-validation-for="Price" class="text-danger"></span>
Artist: <select name="Artist">
@foreach (Artist artist in ViewBag.Artists)
{
<option value=@artist.ArtistID>@artist.Name</option>
}
</select>
<span asp-validation-for="Artist"></span>
Genre: <select name="Genre">
@foreach (Genre genre in ViewBag.Genres)
{
<option value=@genre.GenreID>@genre.Name</option>
}
</select>
<span asp-validation-for="Genre"></span>
<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都为null . 为完整起见,这是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.Artists和ViewBag.Genres分别定义为 _context.Artists.ToList()
和 _context.Genres.ToList()
. 每个流派和艺术家都包含 Name
和 [class]ID
,而Artist也有一个名为 Bio
的关联文本字段 .
“相册”表包含AlbumID,ArtistID,GenreID,Price和Title的字段 . 前三个是整数,第二个是小数,最后一个是nvarchar .
需要做些什么:
A)提交 select
元素的内容以及表格的其余部分?
B)使用ArtistID和GenreID值(各自类中的 int
)作为填充“专辑”表的参数?
1 回答
每个选择输入的名称需要与模型中的字段相对应,该值将在模型绑定发生时填充 .
更改代码:
至
和Genre select一样,name =“GenreID”
这将允许模型绑定正确地获取这些值,然后您可以根据需要在Controller中使用它们 .